アプリ版:「スタンプのみでお礼する」機能のリリースについて

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で動作すること。
---------------------------------------------------------------

他に不足している点があれば、回答させていただきます。
以上、よろしくお願いいたします。

A 回答 (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() されます。
    • good
    • 0
この回答へのお礼

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

おかげさまでうまくいきました、ありがとうございます。

お礼日時:2008/12/04 19:51

#1です。


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

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

お礼日時:2008/12/04 19:54

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

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