- ベストアンサー
Flashでmc.onPress = function() を使ったスクリプトでわからない所が・・・
FLASHのActionScriptで質問です。 今の赤・青・緑の3種類のムービークリップ(以下、MC)をそれぞれ6つ、 合わせて18つステージ上に配置し、それぞれに… 赤)markRed01_mc, markRed02_mc … markRed06_mc 青)markBlue01_mc, markBlue02_mc … markBlue06_mc 緑)markGreen01_mc, markGreen02_mc … markGreen06_mc という、インスタンス名をつけています。 --画面の模式図------------------ ┌───────────┐ │ │ │● ● ● ● ● ● │←赤の段 │ │ │● ● ● ● ● ● │←青の段 │ │ │● ● ● ● ● ● │←緑の段 │ │ └───────────┘ -------------------------------- これらのMC全てに対して「マウスを押した時」に消えるようにするため、 以下のscriptをタイムライン上に記述しました。 for (var i = 1; i<=6; i++) { this["markRed0"+i+"_mc"].hit.onPress = function() { eval((targetPath(this).substring(0, 20))).play(); }; this["markBlue0"+i+"_mc"].hit.onPress = function() { eval((targetPath(this).substring(0, 21))).play(); }; this["markGreen0"+i+"_mc"].hit.onPress = function() { eval((targetPath(this).substring(0, 22))).play(); }; } [解説] ・MC内の当たり判定用のMC(インスタンス名:hit)に対し、 マウスを押した時にMCが再生(消えていくアニメーション)するようにしています。 ・MC内では最初にthis.stop();させ、 押して再生された後に、 MC内の最終フレームに来た時に再びthis.stop();するようしています。 このとき、上記のscriptを実行させると“問題なく動きます”。 しかし、MCに対するplay();命令で、 「eval((targetPath(this).substring(0, 20))...」という あまり「スマートでないやり方」になってしまっています。 そこで、これと同じように動作し、且つスマートに記述する方法があれば 教えていただきたく今回質問させていただきました。 なお、開発環境は以下の通りです。 --------------------------------------------------------------- システム:Microsoft Windows XP Professional Version2002 SP3 FLASH:macromedia FLASH Professional Ver8.0 ※ただし、Flash Player 7で動作すること。 --------------------------------------------------------------- 他に不足している点があれば、回答させていただきます。 以上、よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
this.markRed01_mc.hit.onPress = function() { … }; というスクリプトを書いた場合, その { … } 内で使われる this は markRed01_mc.hit になります。 スクリプトを書いた階層 └markRed01_mc └hit ←これが this hit の親のタイムラインを play() させたいわけですから, eval((targetPath(this).substring(0, 20))).play(); ↓変更↓ this._parent.play(); でうまく行くと思いますよ(検証はしていませんが)。 なお,この場合, _parent.play(); と書くのと, this._parent.play(); とでは意味が違います。 _parent.play(); では,スクリプトを書いた階層の親階層が play() されます(そんな階層があれば)。 this._parent.play(); では,hit の親階層が play() されます。
その他の回答 (2)
- cspl
- ベストアンサー率83% (55/66)
#1です。 再生させるのはhitではなくその上の階層のMCなのですね。すみません、勘違いしていました。 でしたら、#2の方の記述通り、thisの部分をすべてthis._parentに置き換えてください。
お礼
ご回答ありがとうございました。
- cspl
- ベストアンサー率83% (55/66)
どこまで「スマート」さを求めるかにもよりますが、パス指定をシンプルにしたい、ということでしたらeval部分をthisに置き換えればいいのではないでしょうか? ______________________________________________________ for (var i = 1; i<=6; i++) { this["markRed0"+i+"_mc"].hit.onPress = function() { this.play(); }; this["markBlue0"+i+"_mc"].hit.onPress = function() { this.play(); }; this["markGreen0"+i+"_mc"].hit.onPress = function() { this.play(); }; } ______________________________________________________ 全く同じ命令文(hitをplayさせる)を繰り返し記述しているため、この記述も完全にスマートは言えませんが、クラスを使用しない記述であれば気にならないかな、というレベルです。 一番シンプルに済むのはすべてのhitのMovieClipを共通にして、hitのフレームに直接書くことです。上記の命令だけであれば3行だけで済むはずです。 □MC[hit]に記述 ______________________________________________________ this.onPress = function() { this.play(); }; ______________________________________________________
お礼
ご丁寧な回答ありがとうございます。 ご指摘の通り、this._parent.play();でなく、_parent.play();でプログラムを組んでいた経緯で、フクザツなプログラムになってしまっていたようです。 おかげさまでうまくいきました、ありがとうございます。