• ベストアンサー

マウスに追随するMC

マウスに追随するMCがあります。そこまではスクリプトで書いています。 そのMCをウネウネした縦のガイドラインに沿わせて、マウスのY座標のみで動かしたいのですが、どうしてもまっすぐにしか移動してくれません。 どうしたらよいでしょうか? よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • DPE
  • ベストアンサー率85% (666/776)
回答No.1

ガイドに沿って動かすトゥイーンは、スクリプトではサポートされていなかったかと思います。 予めガイドに沿うモーショントゥイーンとして作っておき、マウスカーソルの位置に対応するフレームを割り出して、表示するフレームを切り替えるという方法はいかがでしょう。 マウスカーソルの位置は _xmouse および _ymouse プロパティを見ると分かります。 このプロパティは実は、どのムービークリップのプロパティを見るかによって値が変わります。 Flash ではムービー自身もムービークリップとして扱い、通常は _root という名前で参照します。 _xmouse と _ymouse には、そのムービークリップの中心点から見たマウスカーソルの座標が入っています。 ステージの中心点は左上ですので、ステージ = _root の _xmouse と _ymouse を見ると、ステージの左上を原点とするマウスカーソルの座標を取得できます。 _xmouse と _ymouse は、ムービークリップのインスタンスであればどれでも持っているプロパティです。 例えばステージに clip というムービークリップのインスタンスを配置し、  x = _root.clip._xmouse; とすれば、clip の中心点を原点とするマウスカーソルの位置を取得できます。 今回は、マウスカーソルの位置からフレームの番号を割り出します。 フレーム番号は1から始まりますから、できるだけマウスカーソルの座標とフレーム番号が1対1に対応するように作った方が、計算式は考えやすくなります。 _root の中心点は先述の通りステージの左上なので、これを原点とする位置情報では計算が面倒です。 そこで、_root ではなくあるムービークリップの中心点から見たマウスカーソルの位置を利用する方法を考えます。 ムービークリップの中心点を基準にした設計であれば、ムービークリップをステージのどこに配置しても、数値やスクリプトを変更することなく同じ動作になります。 ------------------------------------------------------ まず、ムービークリップシンボルの中にモーションガイドと動かすムービークリップを配置し、1つのムービークリップにします。 ムービークリップインスタンスの中心点とは、ステージに配置した時に表示される+マーク(○と+が重なったマークとして表示される場合もあります)の位置です。 インスタンスの中心点は元になっているシンボルと必ず同じ位置になり、インスタンスごとに変更はできません。 シンボルの中心点は、シンボルを編集する際に決めることができます。 シンボルの編集画面で、画面中央あたりに+のマークが表示されているかと思います。この位置が、シンボルの中心点になります。マークは移動できないので、絵の方を移動して中心点を決めます。 メインのムービークリップは、中心点が上端になるように作ります。 モーションガイドの上端が+マークの位置に来るように配置してください。「プロパティ」か「情報」パネルでオブジェクトの左上の座標を表示させ、Y座標に 0.0 を入力すると簡単です。 動かすムービークリップをモーションガイドの上端に配置し、ガイドに沿って動くモーショントゥイーンを作ります。 この時、トゥイーンのフレーム数にご注意ください。 例えば _ymouse が 100 だった時、ムービークリップが Y = 100 の位置にくるフレームの番号を計算で割り出して表示するフレームを切り替えるというのが、今回のポイントです。 仮にモーションガイドの高さが 200 だとすると、フレーム 201 でガイドの下端に達するようにトゥイーンを作れば、マウスカーソルの位置と1対1に対応させることができます。 (座標は0から、フレームは1から始まります。座標で0~ 200 は距離にすると 201 ですので、201 フレームのアニメとして作った方が簡単です) モーションガイドが 400px や 500px の場合、ムービークリップのフレーム数も 400 や 500 になると厄介になります。この場合は 200 フレームや 250 フレームといった具合に縮小して作るといいでしょう。 ただし、縮小した分、マウスカーソルの位置からフレーム番号を割り出す計算にも修正が必要になります。 とりあえず、モーションガイドの高さが 200px 、ガイドの上端がムービークリップの中心点に配置されており、201 フレームから成るムービークリップ” clip ”を作ったとします。 マウスカーソルのY座標に合わせて動かすスクリプトは、大体、次のようになります。 このスクリプトは” clip ”のインスタンスに設定してください。 (↓各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください)  onClipEvent(load)  {   //ガイドの高さを保持   guide_h = 200;   //最初はタイムラインを止めておく   this.stop();  }  onClipEvent(mouseMove)  {   //マウスカーソルの座標をチェック   //ガイドの高さの範囲内にある場合のみ、フレームを切り替える   if( this._ymouse >= 0 && this._ymouse <= guide_h )   {    this.gotoAndStop( Math.floor( this._ymouse ) + 1 );    updateAfterEvent();   }  } 普通、ムービークリップの縦の長さは _height というプロパティに保存されています。 しかし、モーションガイドを使ったトゥイーンを含むムービークリップでは _height プロパティにガイドのサイズが反映されないようですので、上記のスクリプトでは guide_h という変数にガイドの高さを保存し、_height プロパティの代わりにしています。 this._ymouse で、clip の中心点(上端)を原点とするマウスカーソルの位置を取得します。 ガイドも clip の中心点に配置されており、アニメのフレーム数もガイドの長さと同じになっていますから、マウスカーソルの位置をそのままフレーム番号に利用できます。 マウスカーソルは小数点以下の数値が付くことがありますから、Math.floor でこれを切り捨て、整数にしてフレームの番号を求めます。 ただ、マウスカーソルの座標は0~ 200 の範囲が有効ですが、トゥイーンのフレームは1~ 201 です。1フレームのズレがありますので、実際に gotoAndStop で移動する時は +1 してズレを補正しています。 まあ、少々力技ですが(^^;)、こんな感じでいかがでしょう。

hanahana32
質問者

お礼

こんなに詳しく、教えていただきとても助かりました。 我ながら身の程知らずな事をやろうとしていました。 マウスに近づくような動きは・・・あきらめます^^; 教えていただいたやり方で、なんとかなりそうです。 本当にありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • マウス追随させるMCの追随する範囲を指定したいです。

    FLASHのマウス追随action script では、 swf画面のどこにマウスがあっても、 どこまでも追随してきますが、 追随する範囲を指定したい場合は、 どのようにしたらよいのでしょうか? 例えば、 パンダの黒目だけがマウスを目で追う。 といったようなことがしたいです。 現状では、黒目が白目から飛び出して(笑) どこまでも黒目だけがマウスを追いかけていってしまっています。 (それはそれでおもしろいけど、これがしたいわけではないのです) FLASHのver は、CS3です。 ASのver は、2でも3でもどちらでもよいです。 よろしくお願いします。

  • マウスの追随でyの動く範囲を指定したい

    初心者ですが、FlashCS3を使っています。 800×600のステージ内の指定した範囲でマウスの追随をしたいので教えてください。 一応、y方向のみに動くマウスの追随効果は作成できたのですが、 y方向に画面いっぱいに追随してしまうので、上から150px~300pxくらいの範囲で 動くだけの操作をしたいです。 ちなみに今途中までてきている追随効果のAction Scriptは下記です。 onClipEvent(enterFrame){ this._y=_root._ymouse; } これに何を記述したら指定範囲のみ追随するようになるでしょうか?

    • ベストアンサー
    • Flash
  • ポインタをmcに追随させるには?

    ポインタをmcに追随させるには? mcをスライドさせるTween使用のas2サンプルを、 クリックをロールオーバーにして、クリックにリンクを設定するものにアレンジ。 [フレーム] import mx.utils.Delegate; import caurina.transitions.Tweener; function tw(_x1:Number,_x2:Number,_x3:Number,_mc1:MovieClip,_mc2:MovieClip,_mc3:MovieClip):Void{ Tweener.addTween (_mc1,{_x:_x1,_y:80,time:2,transition:"easeOutBack"}); Tweener.addTween (_mc2,{_x:_x2,_y:80,time:2,transition:"easeOutBack"}); Tweener.addTween (_mc3,{_x:_x3,_y:80,time:2,transition:"easeOutBack"}); } panel01_mc.onRollOver = Delegate.create (this,function():Void{ tw (200,300,100,panel01_mc,panel02_mc,panel03_mc); }); panel02_mc.onRollOver = Delegate.create (this,function():Void{ tw (100,200,300,panel01_mc,panel02_mc,panel03_mc); }); panel03_mc.onRollOver = Delegate.create (this,function():Void{ tw (300,100,200,panel01_mc,panel02_mc,panel03_mc); }); [ムービークリップ] on(rollOver){ topDepth = _parent.getNextHighestDepth(); this.swapDepths(topDepth); } on(release){ getURL("index.html"); } 問題は、前面中央にスライドするmcに連動して、 中央からスライドする別のmcにポインタが反応(ロールオーバー)すること。 ロールオーバーでmcがスライドした際、 ともにポインタを自動的に追随させる方法がありましたらお教えください。 もちろん別の解決方法があれば、そちらの方をお教えいただければ助かります。 当方はas3ではタイムラインのコントロールもおぼつかないレベルです。

  • マウスを追いかける

    ムービークリップがマウスを追いかけるというようにしたいのですが、追いかけるムービークリップが別のシンボルの中にあると座標がずれるようで、このずれをなくしたいのですがどのようにすればよいのでしょうか? 詳しくは、シーン1にシンボル(ただの図形と追いかけてほしいムービー:mc1)を置いて、mc1に下記のスクリプトを書きました。 -------------------------------------------- onClipEvent (load) { _root.mc1.startDrag(true); x = _root._xmouse; y = _root._ymouse; } onClipEvent (enterFrame) { _x += (_root._xmouse-_x)/4; _y += (_root._ymouse-_y)/4; } --------------------------------------------

    • ベストアンサー
    • Flash
  • mcのドラッグアンドドロップ処理について

    現在、http://okwave.jp/qa3589973.htmlのドラッグアンドドロップを使用させて頂いております。 上記のスクリプトですと、mcからマウスを放したとき(falseのとき)、瞬時にmcの動作が止まるようになっているのですが、これを目的の座標に移動しつつゆっくりと止まっていくようにするには、どのようにスクリプトを書き換えればよいのでしょうか? また、このmcの中にボタンを配置してリンクを張る場合、どういった方法でスクリプトを書けばよいのかもお教え頂けると助かります。 お分かりの方がいらっしゃいましたらご教授いただけると幸いです。 よろしくお願い致します。 // この MC が表示されたとき onClipEvent (load) { // 重さの変数 weight を設定(変えてください) weight = 10; // ●x座標の最小値 min_x を設定(変えてください) min_x = 100; // ●x座標の最大値 max_x を設定(変えてください) max_x = 300; // ●y座標の最小値 min_y を設定(変えてください) min_y = 50; // ●y座標の最大値 max_y を設定(変えてください) max_y = 350; // クリックしたかどうかの変数 click_flag を false にする click_flag = false; } // この MC を押したとき on (press) { // クリックしたかどうかの変数 click_flag を true にする click_flag = true; // ★押した座標を保存 pos_x = this._xmouse; pos_y = this._ymouse; } // この MC をとにかく放したとき on (release, releaseOutside) { // クリックしたかどうかの変数 click_flag を false にする click_flag = false; } // 1フレーム進む時間毎に随時実行 onClipEvent (enterFrame) { // click_flag が true の時だけ if (click_flag) { // この座標を 1/weight ずつ ★マウス座標-押した座標 に近づける this._x += (_root._xmouse-pos_x-this._x)/weight; this._y += (_root._ymouse-pos_y-this._y)/weight; // ●設定した x座標最小値以下の場合 if (this._x<=min_x) { this._x = min_x; } // ●設定した x座標最大値以上の場合 if (this._x>=max_x) { this._x = max_x; } // ●設定した y座標最小値以下の場合 if (this._y<=min_y) { this._y = min_y; } // ●設定した y座標最大値以上の場合 if (this._y>=max_y) { this._y = max_y; } } }

    • ベストアンサー
    • Flash
  • 複製したMCを指定した座標へ配置したいのですが

    こんにちは。 初歩的な質問で申し訳ないのですがよろしくお願いします。 attachMoiveでライブラリ内のMCを数十個複製しそれらをステージ内に 配置する際、4x4、6x6といったように均等に数十個配置する事は 出来るのですが均等に配置するのではなく自分の指定した座標に 1つ1つ配置したいのです。 色々調べましたら、自分の配置したい各場所の各座標(x,y)を 配列を使い変数にするのだと思い、自分なりに作ってみましたところ 1つは指定した座標に配置出来たのですが2つ目以降が上手く 配置出来ません。 var i; var num=50; //複製するmcの数 var pos = {x:50, y:100}; //1つ目の指定座標。              //ここで残り49個のmcの座標も指定。 for (i=0; i<num; i++) { _root.attachMovie("mc", "mc"+i, i); var mc_obj = eval("_root.mc"+i); mc_obj._x = pos._x; mc_obj._y = pos._y; } 一応頭の中ではこういうスクリプトを考えてますが多分間違いが あり何かが足りないのだと思います。 var posのところで2つ目以降の座標の指定の仕方と forの中でmc_obj._xとmc_obj._yにどのように50個分指定した 座標へ配置設定をしてやるのかお分かりくださる方がいらっしゃれば ご教授くださいますようよろしくお願いします。

    • ベストアンサー
    • Flash
  • createEmptyMovieClipdeで作成したmcをASで動かす

    createEmptyMovieClipで空のムービークリップを作成し、 そのMCに画像を読み込ませた後、右に徐々に移動させたい場合、 どのようなスクリプトを書いたらよいのでしょうか。 for(i=0; i < 10; i++){ createEmptyMovieClip(["load_mc"+i],i); _root["load_mc"+i]._x = i*120; _root["load_mc"+i]._y = 20; _root["load_mc"+i].loadMovie(img); } _root["load_mc"+i]._x += 10; とすると、単純にx座標が10の所にMCが配置されるだけで、 モーショントゥイーンのように動いてくれません。。。。

    • ベストアンサー
    • Flash
  • mcをランダムに並べたい

    winXP、flash8です。 6個のmc(h0~h5)をステージにランダムに並べるようスクリプトを考えています。 ランダムの数R[0]~R[5]までが出ています。 下記のようにx座標とy座標を決め配置したいと思ったのですが うまくいきません。 どこが、違うのか教えてください。よろしく、お願いします。 tx0 = 60; tx1 = 136; tx2 = 212; tx3 = 288; tx4 = 364; tx5 = 440; for (i = 0; i < 6; i++) { num = "_root.h" + R[i]; num._y = 76; num._x = "tx" + [i]; }

    • ベストアンサー
    • Flash
  • ムービー上の特定の座標上にマウスオーバーがあった場合だけ特定の処理をしたい

    ムービー上の特定の位置にマウスが載った場合、 特定のMCの動きを制限したいのですが、 どの場合、「ムービー上の特定の位置にマウスが載っているかどうか」を判断するにはどのようなスクリプトを書けばいいでしょうか。 <具体例> y座標範囲0~100 で、x座標範囲0~600 の範囲内にあるときだけ、mc_birdに、function fly() を実行させたい。 <_rootのフレームアクション> this.onEnterFrame = function(){ ※ここに条件分岐等を入れればいいと思うのですが、 何を書けばいいのかわかりません。 } 宜しくお願いします。

    • ベストアンサー
    • Flash
  • 複数の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)

    • ベストアンサー
    • Flash