- ベストアンサー
対象を絞った衝突処理の方法
- WinXP,flash8ProでのMCの衝突判定処理についての質問です。
- 特定のインスタンスのMCのみを列挙する方法について、解決策を教えてください。
- 使用したindexOFなどの方法では上手くいかず、困っています。どうぞよろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
大元のMCを引数に一回実行してください。 Search(_root.main_mc) です。 この関数でやっていることはtarget_mcを含んでいるMCに対して flg=trueを設定するということです。 含んでいなければflg=falseを設定します。 引数で渡したMC(この場合だと_root.main_mc)の中にある全てのMCに flgの値が設定されます。 ここで言ってるflgの設定とはmcそれぞれの階層にflgという変数を作ってるって事です。 なので適当にtrace(mcのパス.flg)とやるとtrueかfalseが返ってくるはずです。 例えばMCが次のような階層で配置されているとします。 _root.main_mc +a_mc +b_mc +c_mc +target_mc +d_mc パスで書くと a_mc : _root.main_mc.a_mc b_mc : _root.main_mc.b_mc c_mc : _root.main_mc.b_mc.c_mc d_mc : _root.main_mc.b_mc.d_mc です。 そしてtarget_mcがあるのは _root.main_mc.b_mc.c_mcの中です。 なのでtarget_mcを含むMCはc_mcとその親であるb_mcです。 ここで関数を実行してSearch(_root.main_mc)、 各MCのフラグを見てみると trace(_root.main_mc.a_mc.flg); //false trace(_root.main_mc.b_mc.flg); //true trace(_root.main_mc.b_mc.c_mc.flg); //true trace(_root.main_mc.b_mc.d_mc.flg); //false という結果になります。 で、列挙する前にこのflgの値を見るわけです。 そうするとそのMCがtarget_mcを含んでいるかどうかがわかります。 >"target_mc"というインスタンスを含むMCだけを列挙させたい というのが実現できると思います。
その他の回答 (3)
- perse
- ベストアンサー率74% (113/152)
確かに毎回ターゲットMCを検索していたのでは重くなりそうです。 では全てのmcにフラグを持たせてはどうですか? #2のsearch関数をちょっと変更して function Search(hoge_mc:MovieClip):Boolean { var ret:Boolean = false; for (var clip in hoge_mc) { if (typeof (hoge_mc[clip]) == "movieclip") { hoge_mc[clip].flg = false; if (hoge_mc[clip]._name == _root.target_str) { ret = true; hoge_mc[clip].flg = true; break; } else { ret = Search(hoge_mc[clip]); if (ret) { hoge_mc[clip].flg = true; } } } } return ret; } //実行するのは大元のMC Search(_root.main_mc) //この戻り値はfalseになります。 これなら最初に一回(大元のMCの数)実行するだけです。 列挙する前にmcのflgの値を見ればターゲットMCを含んでいるかどうかがわかります。
補足
お返事有難う御座います。 質問なのですが、このFunctionを いつ、どこに、どの様に使用すればよいのでしょうか? 一度メインのタイムラインにてFunctionを実行したとして、これを実行した後、 これをどうすれば良いのでしょうか? Search Functionの中身が良く分からないので どう当てはめて利用したらいいのかが まったくわかりません^^; どうぞ宜しくお願い致します。
- perse
- ベストアンサー率74% (113/152)
親MCにフラグを持たせておいてはどうでしょうか? 列挙する前にそのフラグの値をみて trueなら列挙するfalseなら列挙しないということです。 ※全角スペースが含まれています。 コピペする際はリプレイスしてください。 //このインスタンス名のMCを含んでいたら列挙する var target_str:String = "target_mc"; //MC内を検索する関数 //target_strを含んでいたらtrueを返す function Search(hoge_mc:MovieClip):Boolean { var ret:Boolean = false; for (clip in hoge_mc) { //インスタンス名を比較 if (hoge_mc[clip]._name == _root.target_str) { ret = true; break; } else { //再帰処理 ret = Search(hoge_mc[clip]); } } return ret; } //MC内を検索し親MCにフラグを設定 _root.main_mc.flg = Search(_root.main_mc); //あとは列挙する関数を呼ぶ //この関数内でflgの値に応じて列挙する _global.Mc_Hit_Check(_root.main_mc)
補足
お返事有難う御座います。 >//このインスタンス名のMCを含んでいたら列挙する >var target_str:String = "target_mc"; このインスタンス名ですが、パスが _root.main_mc.move_map_mc.move_map_mc_mc.monstermap_mc.mons_swf_load1_mc.mons_swf_load1_mc_mc.mons_mc.mons1_loading_mc.mons1_loading_mc_mc; のmons1_loading_mc_mcが前回記載しました "target_mc"にあたります。 _root.main_mc.move_map_mc.move_map_mc_mc.monstermap_mc.mons_swf_load2_mc.mons_swf_load1_mc_mc.mons_mc.mons1_loading_mc.mons1_loading_mc_mc; _root.main_mc.move_map_mc.move_map_mc_mc.monstermap_mc.mload3_mc.mons_swf_load1_mc_mc.mons_mc.mons1_loading_mc.mons1_loading_mc_mc; _root.main_mc.shop_map_mc.shop_map_mc_mc.monstermap_mc.mons_swf_load1_mc.mons_swf_load1_mc_mc.mons_mc.mons1_loading_mc.mons1_loading_mc_mc; この様なパスが何十とあり、それが検索対象であり、リアルタイムで随時衝突判定処理に使用されなくてはいけません。 検索していると重たくなる気もしています・・・。 やはり動的なスクリプトではなく、一つ一つで 個別にスクリプトを準備して検索する必要を なくした方が良いのでしょうか。 でも、それだと混用性がなくなってしまいます。 私の説明足らずな感がいなめませんが、頭の中がワケワカメな状態でして、なんと説明していいやら^^; どうぞ宜しくお願い致します。
- perse
- ベストアンサー率74% (113/152)
if ( MC._name == "target_mc" ){ } で出来ませんか?
補足
お返事有難う御座います。 書いてから気がついたのですが、Gooは訂正できないシステムですのでこの場をかりて訂正させて頂きます。 【訂正前】 "target_mc"というインスタンスのMCだけを列挙させたい場合 【訂正後】 "target_mc"というインスタンスを含むMCだけを列挙させたい場合 どうぞ宜しくお願い致します。
お礼
やっと動き出しました! どうもありがとうございました。 とても勉強になりました。