• ベストアンサー

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で動作すること。 --------------------------------------------------------------- 他に不足している点があれば、回答させていただきます。 以上、よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.2

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() されます。

eye-eye
質問者

お礼

ご丁寧な回答ありがとうございます。 ご指摘の通り、this._parent.play();でなく、_parent.play();でプログラムを組んでいた経緯で、フクザツなプログラムになってしまっていたようです。 おかげさまでうまくいきました、ありがとうございます。

その他の回答 (2)

  • cspl
  • ベストアンサー率83% (55/66)
回答No.3

#1です。 再生させるのはhitではなくその上の階層のMCなのですね。すみません、勘違いしていました。 でしたら、#2の方の記述通り、thisの部分をすべてthis._parentに置き換えてください。

eye-eye
質問者

お礼

ご回答ありがとうございました。

  • cspl
  • ベストアンサー率83% (55/66)
回答No.1

どこまで「スマート」さを求めるかにもよりますが、パス指定をシンプルにしたい、ということでしたら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(); }; ______________________________________________________

関連するQ&A