- ベストアンサー
複数のMC(ドラッグで移動可能)から等しい距離にMCを配置したい
ドラッグで移動可能な複数のムービークリップから等しい距離の位置にムービークリップを配置したいです。 以下『複数』が3つの場合を例にします。 MC4はMC1、MC2、MC3がドラッグで移動されると、MC1、MC2、MC3への距離が等しい位置(厳密に等しくなくても良い)に移動させたいです。(結果、MC4はMC1、MC2、MC3を三角形とした際の重心点上に配置される) オーサリングツールは『ParaFla!』ActionSctiptは1.0相応で以下の様に作ってみましたが、いつまで経っても落ち着かないので改善したいです。 ※スクリプトのスペースは全角で記述。 ■MC1、MC2、MC3 _root上にMC1を深度0、[固定]で配置。 _root上にMC2を深度1、[固定]で配置。 _root上にMC3を深度2、[固定]で配置。 MC1,MC2,MC3にテキストで●を配置。 MC1,MC2,MC3に以下スクリプトを記述。 on (press){ this.startDrag(); // ドラッグを開始する } - on (release, releaseOutside){ this.stopDrag (); // ドラッグを解除する } ■MC4 _root上にMC4を深度3に配置。 MC4にテキストで○を配置し、以下スクリプトを記述。 onClipEvent (enterFrame){ long=0; short=0; for(i=1;i<=3;i++){ mc=eval('_root.MC'+i); length=Math.sqrt((mc._x-_x)*(mc._x-_x)+(mc._y-_y)*(mc._y-_y)); if(long<=length){ long=length; long_mc=mc; } if(short>=length||short==0){ short=length; short_mc=mc; } } _x += ((long_mc._x+short_mc._x)/2 - _x)/5; _y += ((long_mc._y+short_mc._y)/2 - _y)/5; } 上記のようにして作成したものを以下に置きます。 http://carken.web.fc2.com/osiete/test3.html 動かしてみると、いつまでたっても、細かく動いて止まってくれません。 厳密に同じ距離でなくても良く、ある程度見た目にOKかなってところで止まるようにしたいです。 アドバイスありましたら、よろしくお願いいたします。 参考 『2つのMC(ドラッグで移動可能)から等しい距離にMCを配置したい』(http://oshiete1.goo.ne.jp/qa4328262.html)
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
こんにちは。 三角形ABCの重点Gは3つの中線の交わる点で、"G=(A+B+C)/3"となります。 ですから、MC4座標の算出方法を MC4._x = (MC1._x + MC2._x + MC3._x)/ 3; MC4._y = (MC1._y + MC2._y + MC3._y) / 3; と変えてみてはどうでしょう。 この2つで重点の座標が出るはずです。 つい先日、同じようなものをASの勉強で作っていた所です。 http://www5.pf-x.net/~vivo/sample/triangle.swf
その他の回答 (1)
- BlurFiltan
- ベストアンサー率91% (1611/1754)
#1 の方とほぼ同意見で,前半が少し違います。 というかご質問が2つに取れます。 > ムービークリップから等しい距離の位置にムービークリップを配置したい と言うことでしたら, 三角形の外心(外接円の中心)を求めることになると思います。 これには,次の URL の式を使わせてもらうことにします。 「メモ-別記5」 http://www.h6.dion.ne.jp/~jpe02_tn/ki-5.html > 1 外接円の中心座標を求める計算式 > A1=2(X2-X1) > B1=2(Y2-Y1) > C1=X1^2-X2^2+Y1^2-Y2^2 > A2=2(X3-X1) > B2=2(Y3-Y1) > C2=X1^2-X3^2+Y1^2-Y3^2 > X=(B1C2-B2C1)/(A1B2-A2B1) > Y=(C1A2-C2A1)/(A1B2-A2B1) これを, MC4 のスクリプトに直すと次のようになります。 ------------------------------------ onClipEvent (enterFrame) { A1 = 2*(_root.MC2._x-_root.MC1._x); B1 = 2*(_root.MC2._y-_root.MC1._y); C1 = _root.MC1._x*_root.MC1._x-_root.MC2._x*_root.MC2._x+_root.MC1._y*_root.MC1._y-_root.MC2._y*_root.MC2._y; A2 = 2*(_root.MC3._x-_root.MC1._x); B2 = 2*(_root.MC3._y-_root.MC1._y); C2 = _root.MC1._x*_root.MC1._x-_root.MC3._x*_root.MC3._x+_root.MC1._y*_root.MC1._y-_root.MC3._y*_root.MC3._y; X = (B1*C2-B2*C1)/(A1*B2-A2*B1); Y = (C1*A2-C2*A1)/(A1*B2-A2*B1); _x += (X-_x)/5; _y += (Y-_y)/5; } ------------------------------------ > MC4はMC1、MC2、MC3を三角形とした際の重心点上 ということでしたら,式は全く変わります。 また上のURLの式を使わせてもらうことにします。 > 2 重心の座標を求める計算式 > X=(X1+X2+X3)/3 > Y=(Y1+Y2+Y3)/3 これを, MC4 のスクリプトに直すと次のようになります。 ------------------------------------ onClipEvent (enterFrame) { X = (_root.MC1._x+_root.MC2._x+_root.MC3._x)/3; Y = (_root.MC1._y+_root.MC2._y+_root.MC3._y)/3; _x += (X-_x)/5; _y += (Y-_y)/5; } ------------------------------------
お礼
ご回答ありがとうございます。 > > ムービークリップから等しい距離の位置にムービークリップを配置> したい > > と言うことでしたら, > 三角形の外心(外接円の中心)を求めることになると思います。 等しい距離の位置だと重心になると思い込んでましたが、違うのですね。教えていただいたURLが、とても勉強になりました。
お礼
ご回答ありがとうございます。 >つい先日、同じようなものをASの勉強で作っていた所です。 まさにこんな事がしたかったのです。