- ベストアンサー
2つの異なる階層のMCを操作する方法
WIN=XP SP2 ,Flash8proの環境でオーサリングしています。 質問です。 _root.1_1_mc.1_2_mc.1_3_mc.obje_mc.obje_mc_mc _root.2_1_mc.2_2_mc.player_mc.player_mc_mc.player_mc_mc_mc の上記2つのMCがありまして、 _root.1_1_mc.1_2_mc.1_3_mc.obje_mc.obje_mc_mc はランダムに動いており、 _root.2_1_mc.2_2_mc.player_mc.player_mc_mc.player_mc_mc_mc は、キーボードからの入力によってコントロールされ動いております。 それぞれのMCの座標基準点はすべてばらばらなのですが、 その場合に、キーボードのHキーを押した時のアクションとして、 _root.2_1_mc.2_2_mc.player_mc.player_mc_mc.player_mc_mc_mc が _root.1_1_mc.1_2_mc.1_3_mc.obje_mc.obje_mc_mc を 手に持ったまま動き回れるようにしたいのですが、 座標基準点がばらばらで、試行錯誤いたしましたが 持たせて動き回れる方法が解りません。 ちなみに、ASのみで動作させるには どうしたらよういでしょうか。 どうぞ宜しくお願い致します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
横から失礼します。 「手で持つ」ムービークリップ( MC1 )も「手」のムービークリップ( MC2 )も、ともに他のムービークリップの入れ子になっているもので、その _x と _y プロパティにはそれぞれの親の基準点を原点とする座標が格納されています。 異なる座標系の座標をもとに移動させると、違う基準から見た数値同士であるために当然ながらズレが生じます。 どちらか一方だけをステージの座標に直しても、もう一方は依然として自分の親の基準点を原点とする座標のままですから、やはり異なる座標系の座標同士であることに変わりはありません。 違う座標系に属するムービークリップの位置に移動させるには、どちらかの座標を変換して同じ座標系の数値として扱えるようにする必要があります。 MovieClip クラスには座標変換のメソッドとして、ムービークリップの座標系の座標(ローカル座標)をステージ座標(グローバル座標)に変換する” localToGlobal ”と、逆にグローバル座標をローカル座標に変換する” globalToLocal ”があります。 ムービークリップ MC1 のローカル座標を別のムービークリップ MC2 のローカル座標に直接変換するメソッドはありませんが、MC1 のローカル座標を localToGlobal で一旦グローバル座標に直し、これを MC2 の親の globalToLocal で再度変換することで、MC1 と MC2 を同じ座標系に属する座標同士として扱えるようになります。 ************************************************* 例えば、ボタンをクリックした時に「手」のムービークリップ”~ player_mc_mc_mc ”を「持つ」ムービークリップ”~ obje_mc_mc ”の位置に移動させるスクリプトは、大体次のようになります。 (↓各行頭に全角のスペースが入っています。コピーする際はご注意ください) on(release) { //親の参照を格納 MC1 = _root[ "1_1_mc" ][ "1_2_mc" ][ "1_3_mc" ].obje_mc; MC2 = _root[ "2_1_mc" ][ "2_2_mc" ].player_mc.player_mc_mc; //「持つ」ムービークリップの座標をグローバル座標に変換 p = new Object(); p.x = MC1.obje_mc_mc._x; p.y = MC1.obje_mc_mc._y; MC1.localToGlobal( p ); //変換した座標を「手」と同じ座標系の座標に変換 MC2.globalToLocal( p ); //変換後の座標に「手」を移動 MC2.player_mc_mc_mc._x = p.x; MC2.player_mc_mc_mc._y = p.y; } 「持つ」ムービークリップ” _root.1_1_mc. … .obje_mc_mc ”は、その親にあたる” _root.1_1_mc. … .obje_mc ”の基準点を原点とした座標系に属します。 ですから、このローカル座標をグローバル座標に直すには、親である ~ obje_mc の localToGlobal を使って変換します。 obje_mc_mc 自身の localToGlobal では変換する座標系が違うため、正しいステージ座標を求められなくなりますのでご注意ください。 「手」のムービークリップ” _root.2_1_mc. … .player_mc_mc_mc ”も、その親である” _root.2_1_mc. … .player_mc_mc ”を基準にした座標系に属しています。 グローバル座標に直した「持つ」ムービークリップの座標を「手」と同じ座標系の座標に直すので、この変換も同様に、「手」の親が持っている globalToLocal を使います。 ターゲットパスが紛らわしいのですが、上記のスクリプトでは、変数 MC1 と MC2 には「持つ」ムービークリップと「手」のムービークリップの”それぞれの親”の参照を代入しています。
その他の回答 (1)
- perse
- ベストアンサー率74% (113/152)
MC.localToGlobalを使って「手」のMCのグローバル座標を取得し、 その位置に_root.1_1_mcを移動させてはどうでしょう。 あとパスが大変長いようですので、 MC1=_root.1_1_mc.1_2_mc.1_3_mc.obje_mc.obje_mc_mc MC2=_root.2_1_mc.2_2_mc.player_mc.player_mc_mc.player_mc_mc_mc というように変数に入れてしまえばすっきりすると思います。
補足
お返事ありがとうございます。 _root.1_1_mc.1_2_mc.1_3_mc.obje_mc.obje_mc_mc _root.2_1_mc.2_2_mc.player_mc.player_mc_mc.player_mc_mc_mc の各MCは、すべて大きさがずいぶん違います。 たとえば、_root.1_1_mcは、2880px*200pxと そのまた下位のMC達もそれぞれ大きさが異なります。 そのそれぞれのMC内に無数のMCが配置されています。 >>MC.localToGlobalを使って「手」のMCのグローバル座標を取得し、 その位置に_root.1_1_mcを移動させてはどうでしょう。 質問なのですが、 下位のMCの座標はくずれないのでしょうか? ちょっと想像がつかないので、崩れるか崩れないかだけ教えていただけると幸いです。 ただ今、実際に試した所、すべてずれてしまいました。 player_mc_mc_mc(プレイヤーのMC)の手の位置に obje_mc_mc(物のMC)を持ってきて、そのまま持ち歩きたいのですが。 MC1=_root.1_1_mc.1_2_mc.1_3_mc.obje_mc.obje_mc_mc; MC2=_root.2_1_mc.2_2_mc.player_mc.player_mc_mc.player_mc_mc_mc; p_x=MC1._x; p_y=MC1._y; p = {x:p_x, y:p_y}; MC1.localToGlobal(p); 【ボタンを押した時のリアクション】 MC2._x=p_x; MC2._y=p_y; これでやってみましたが、MC2がぜんぜん違う所に表示されてしまっています。 ちょっとお手上げ状態なのですが、 どうぞ宜しくお願い致します。
お礼
この度もありがとうございました。 大変解りやすい解説で、苦手だったglobalToLocalの仕組みがやっと理解する事ができました。 スクリプトもそのまま何も問題なく 正常に動作しました。 大変良い勉強をさせて頂き感謝しております。 どうも有り難う御座いました。