電子書籍の厳選無料作品が豊富!

ロールオーバーで下の画像を表示させる:を参考にしています。
http://oshiete.goo.ne.jp/qa/7020788.html

ここはアクションスクリプト2.0でしたが、私はFLASH CS3 アクションスクリプト3.0で
作っています。

その回答をもとに100X100のロールオーバー用の画像を16個表示させるために
書きました。ステージは400x400です。

for (var i:Number = 0; i<=15; i++) {
if (i != 0) {
var my_mc:MC = new MC();
my_mc.x = i%4*100;
my_mc.y = Math.floor(i/4)*100;
addChild(my_mc);
}
}
16個で埋め尽くすことはできましたが、my_mcに番号をつけるなどして配列を使って
やらなければならないと考えますが方法がわかりません。今は16番目(iが15)しか
ロールオーバーしません。

全体のアクションスクリプトを書きます。

import fl.transitions.*;
import fl.transitions.easing.*;

for (var i:Number = 0; i<=15; i++) {
if (i != 0) {
var my_mc:MC = new MC();
my_mc.x = i%4*100;
my_mc.y = Math.floor(i/4)*100;
addChild(my_mc);
}
}

my_mc.addEventListener(MouseEvent.ROLL_OVER,onrollOver);
function onrollOver(eventObj:Event):void {
//ロールオーバーイベントを受けたインスタンスを取得
var target_mc:MovieClip = MovieClip(eventObj.currentTarget);
//そのインスタンスをフェードアウト
TransitionManager.start(target_mc, {type:Fade, direction:Transition.OUT, duration:2, easing:None.easeNone});
//そのインスタンスのイベントリスナーを削除
target_mc.removeEventListener(MouseEvent.ROLL_OVER,onrollOver);
}

A 回答 (1件)

まずその前の AS2 版 ですが


それは duplicateMovieClip(ステージ上にあるMCの複製) を使っているので
左上コーナーの1つは配置したままにしています。

AS3 では duplicateMovieClip(ステージ上にあるMCの複製) は使えないので
左上コーナーに MC を残す意味がありません。むしろ邪魔です。
ですからステージ上には 100×100 の ■MC は1つも残さない方が良いです。

そして if (i != 0) も削除します。




とりあえずそういうこととして
このご質問で書かれているスクリプトでは
単に
my_mc.addEventListener(MouseEvent.ROLL_OVER,onrollOver);
の位置(書き場所)が悪いだけです。

「my_mc」は動的に参照を変える変数ですが
「my_mc」が生成した 各MC 1個体 を対象としているときに
my_mc.addEventListener(MouseEvent.ROLL_OVER,onrollOver);
をすれば良いのです↓。

//-------------------------------------------
import fl.transitions.*;
import fl.transitions.easing.*;

for (var i:int = 0; i<=15; i++) {
//元あった if は削除
var my_mc:MC = new MC();
my_mc.x=i%4*100;
my_mc.y=Math.floor(i/4)*100;
addChild(my_mc);
//ココに移動
my_mc.addEventListener(MouseEvent.ROLL_OVER,onrollOver);
}

function onrollOver(eventObj:Event):void {
//ロールオーバーイベントを受けたインスタンスを取得
var target_mc:MovieClip=MovieClip(eventObj.currentTarget);
//そのインスタンスをフェードアウト
TransitionManager.start(target_mc, {type:Fade, direction:Transition.OUT, duration:2, easing:None.easeNone});
//そのインスタンスのイベントリスナーを削除
target_mc.removeEventListener(MouseEvent.ROLL_OVER,onrollOver);
}
//-------------------------------------------



配列などを使って
個々のインスタンスを参照する変数(要素)を別々に用意してもいいですよ。

そうするにしても
結局 生成した 各MC 1個体 を対象として配列の要素に入れなければなりませんし
効率の良い書き方をするなら(何度も for文 を回さないとするなら)
結局,上の書き方と同じになります↓。

//-------------------------------------------
import fl.transitions.*;
import fl.transitions.easing.*;

//生成する MC を格納する配列を用意
var mcArr:Array = new Array();

for (var i:int = 0; i<=15; i++) {
//配列の各要素に生成した MC の参照を格納
mcArr[i] = new MC();
mcArr[i].x=i%4*100;
mcArr[i].y=Math.floor(i/4)*100;
addChild(mcArr[i]);
//生成した MC の参照に対してイベントリスナーを登録
mcArr[i].addEventListener(MouseEvent.ROLL_OVER,onrollOver);
}

function onrollOver(eventObj:Event):void {
//ロールオーバーイベントを受けたインスタンスを取得
var target_mc:MovieClip=MovieClip(eventObj.currentTarget);
//そのインスタンスをフェードアウト
TransitionManager.start(target_mc, {type:Fade, direction:Transition.OUT, duration:2, easing:None.easeNone});
//そのインスタンスのイベントリスナーを削除
target_mc.removeEventListener(MouseEvent.ROLL_OVER,onrollOver);
}

//配列に MC が入っているかどうかの検証(本題とは関係なし)
mcArr[5].alpha = 0.5;
mcArr[6].rotation = 45;
//-------------------------------------------



細かい部分も変えていますが
要するに 配列を作っても作らなくても
addEventListener(MouseEvent.ROLL_OVER,onrollOver);
をする位置は同じ(この位置を考えましょう)ということです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!