- ベストアンサー
インスタンス名の変更mcどうしのhittest
- Flash,actionscriptの初心者です。現在actionscript2.0でちょっとしたFlashコンテンツを作っているのですが、解決できないことがあり、ぜひお知恵を拝借できればと思います。
- A1_mcとB1_mcのムービークリップをhittestで衝突判定させ、B1_mcは見えないようにし、A1_mcはgotoAndPlay(2)で2フレーム目に変化させて、インスタンス名をC1_mcに変更しました。同様にA2_mcとB2_mcを設定しました。
- しかし、インスタンス名を変更した物どうしのhittestをうまく発動させる方法がわからずに困っています。お互いに反応しない二つのムービークリップが合体して反応するムービークリップが出現するFlashを作りたいのです。どのようにすればよいか教えていただきたいです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 > C1_mc.onEnterFrame = c1EnterFrame;//←★付け足し★ > があるとなぜ存在できるのか(なぜこれがないとダメなのか) > を教えていただければ幸いです。 ということですが C1_mc.onEnterFrame = c1EnterFrame;//←★付け足し★ これで C1_mc.onEnterFrame イベントハンドラメソッドに function c1EnterFrame () を代入しているわけです。 つまりそこで 「C1_mc君,毎フレーム毎フレーム 関数 c1EnterFrame を実行してくださいよ。」 と命令しているということになります。 #1では, スクリプトの修正を最小限にしているために, そういう書き方をしましたが 次のように書いても良い(同じこと)です。 //----------------------------------------------- A1_mc.onEnterFrame = function() { if (this.hitTest(_root.B1_mc)) { _root.B1_mc.gotoAndPlay(2); //2フレーム目(空のキーフレーム)にとび、B1を消す this.gotoAndPlay(2); //○⇒☆(2フレーム目)に姿を変える this._name = "C1_mc"; //インスタンス名をA1_mcからC1_mcに変える trace(this._name);//インスタンス名の変更を確認する。 delete this.onEnterFrame; //↓★下にあったものをココ以下に移動★ C1_mc.onEnterFrame = function () { if (this.hitTest(_root.C2_mc)) { this.visible = false;//姿を消す _root.C1_mc.visible = false; _root.D_mc.gotoAndPlay(2);//D_mcの出現(D_mcの1フレーム目は透明で見えなくしている。2フレーム目からアニメーションさせたいのでvisibleは使わない) delete this.onEnterFrame; } else{} }; } else{} }; A2_mc.onEnterFrame = function() { if (this.hitTest(_root.B2_mc)) { _root.B2_mc.gotoAndPlay(2); //2フレーム目(空のキーフレーム)にとび、B1を消す this.gotoAndPlay(2); //○⇒☆(2フレーム目)に姿を変える this._name = "C2_mc"; //インスタンス名をA2_mcからC2_mcに変える trace(this._name);//インスタンス名の変更を確認する。 delete this.onEnterFrame; } else{} }; //★ココにあったものを上に移動★ //----------------------------------------------- この書き方をすれば「付け足し」ではなくなりますよね。 大移動です。 結局どちらにしても#1にも書いたように 「C1_mc」という名前のインスタンスが登場してから その「C1_mc」に対して onEnterFrame イベントハンドラメソッド を設定する。 ということをしていることに変わりはありません。
その他の回答 (1)
- BlurFiltan
- ベストアンサー率91% (1611/1754)
できない理由は簡単なことで, C1_mc.onEnterFrame = function()… を設定(実行)した時点で C1_mc など存在しないからです。 いない者に命令などできません。 それは他言語でも同じです。 (たいていどの言語でも, すでにあるインスタンスにプロパティ設定や動作登録するか インスタンスを生成してからプロパティ設定や動作登録するかです。) また普通の日常(日本語)でも同じです。 例えば C君 がいないところで, 「C君,白菜を買ってきなさい。」などと言っても(勝手につぶやいても) C君 は白菜を買いに行くはずありませんよね。 (=虎を縛るのなら虎が要る。いない虎は縛れない。) というわけで, 内容の良し悪しは別として 元のままをなるべく変えないとするなら C1_mc.onEnterFrame = c1EnterFrame;//←★付け足し★ と //↓★変更★ function c1EnterFrame () の ★を付けた2箇所(2行)のみの変更になります↓。 //------------------------------------------- A1_mc.onEnterFrame = function() { if (this.hitTest(_root.B1_mc)) { _root.B1_mc.gotoAndPlay(2); //2フレーム目(空のキーフレーム)にとび、B1を消す this.gotoAndPlay(2); //○⇒☆(2フレーム目)に姿を変える this._name = "C1_mc"; //インスタンス名をA1_mcからC1_mcに変える trace(this._name);//インスタンス名の変更を確認する。 delete this.onEnterFrame; C1_mc.onEnterFrame = c1EnterFrame;//←★付け足し★ } else{} }; A2_mc.onEnterFrame = function() { if (this.hitTest(_root.B2_mc)) { _root.B2_mc.gotoAndPlay(2); //2フレーム目(空のキーフレーム)にとび、B1を消す this.gotoAndPlay(2); //○⇒☆(2フレーム目)に姿を変える this._name = "C2_mc"; //インスタンス名をA2_mcからC2_mcに変える trace(this._name);//インスタンス名の変更を確認する。 delete this.onEnterFrame; } else{} }; //↓★変更★ function c1EnterFrame () { if (this.hitTest(_root.C2_mc)) { this.visible = false;//姿を消す _root.C1_mc.visible = false; _root.D_mc.gotoAndPlay(2);//D_mcの出現(D_mcの1フレーム目は透明で見えなくしている。2フレーム目からアニメーションさせたいのでvisibleは使わない) delete this.onEnterFrame; } else{} } //-------------------------------------------
お礼
BlurFiltan 様 素早い回答、誠にありがとうございます。前回の私の質問にも 答えてくださり、本当に感謝しております。 ご指摘の通り追加変更したところ、自分の作っているFlashでも 動作するようになりました。半日くらい悩んでいたので 目から鱗でした。 名前の変更だけでは存在することにならないということでしょうか。 traceでは名前が変わっていただけに、てっきり存在するものかと・・。 勉強になります。もし可能でしたら、 C1_mc.onEnterFrame = c1EnterFrame;//←★付け足し★ があるとなぜ存在できるのか(なぜこれがないとダメなのか) を教えていただければ幸いです。何となく分かるようで分かりません。 基礎が足りない部分が多くて・・・。 もしお時間がありましたら、教えていただければ幸いです。 よろしくお願いいたします。
お礼
BlurFiltan 様 自分の疑問への素早い回答、ありがたく思います。 C1_mcへの処理のことををA1_mcのイベントハンドラメソッドの中にしっかりと記述する必要があると言うことですね。 C1_mc専用のマウスイベントなどもA1_mcのイベントハンドラメソッドの中に入れたらしっかりと発動しました。 このたびは本当に有り難うございました!