- ベストアンサー
addChildの使い方
- アクションスクリプト2.0を参考にして、FLASH CS3 アクションスクリプト3.0で100x100のロールオーバー用の画像を16個表示する方法を説明します。
- アクションスクリプトを使って、16個の画像をステージに配置する方法について説明します。画像は100x100の大きさで配置され、配列を使って管理されます。
- ロールオーバーイベントが発生したインスタンスのフェードアウトを行い、イベントリスナーも削除されます。
- みんなの回答 (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); をする位置は同じ(この位置を考えましょう)ということです。