• ベストアンサー

ムービークリップがマウスカーソルを追いかけ、マウスカーソルと同じ位置に来たときにムービークリップを変えたい

以下のようにスクリプトを書いたのですが ムービークリップがマウスカーソルと同じ位置に来ても ムービークリップがフレーム2に移動しません。 ドラゴンクエストVIIIのトップページのFlashのような 表現をしたいのですがうまくいきません。 http://www.square-enix.co.jp/dragonquest/eight/ _mc.onEnterFrame = function() { this._x += ( _root._xmouse - this._x ) / 5; if( this._x == _root._xmouse ) this._mc.gotoAndStop(2); else this._mc.gotoAndStop(1); }; どうすればこの問題を解決することができるのでしょうか。 ご存知の方がおられましたらご回答をよろしくお願いします。

  • Flash
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
noname#35109
noname#35109
回答No.1

これでいかがでしょうか↓? --------------------------------------------- // _mc に対する onEnterFrame イベントハンドラの定義 _mc.onEnterFrame = function() { this._x += (_root._xmouse-this._x)/5; // 自分自身の座標がマウス座標の ±1 に入れば if (this._x>=_root._xmouse-1 && this._x<=_root._xmouse+1) { // 自分自身を フレーム2 に進ませて止める this.gotoAndStop(2); } else { // 自分自身を フレーム1 に進ませて止める this.gotoAndStop(1); } }; --------------------------------------------- ご質問で書かれているスクリプトには, おそらく2箇所の間違いがあります。 まず1つ目は大きな誤解です。 > ムービークリップがマウスカーソルと同じ位置に来ても > ムービークリップがフレーム2に移動しません。 同じ位置に来ることは決して(一生)ありません。 ムービークリップのマウス追従移動のスクリプトは  this._x += (_root._xmouse-this._x)/5; この1行です。 バラして書くと  this._x = this._x + (_root._xmouse-this._x)/5; です。わかりますでしょうか。 onEnterFrame で, 1フレーム進む時間ごとに, this(自分自身)とマウスの座標の間の距離を 1/5 ずつ縮めているだけです。 1/5 ずつ縮めているだけなので, もし this と マウス との座標の差が 500px あった場合  500→100→20→4→0.8→0.16→0.032→…… となるだけで,決して this._x == _root._xmouse になることはありません。 ですから,  if (this._x>=_root._xmouse-1 && this._x<=_root._xmouse+1) のようにして, 1ピクセルくらいの範囲を持たせないと if 文 は true になりません。 「&&」 は 「なおかつ」 という意味です。 if(this._x は マウス._x-1 より大きく,なおかつ,マウス._x+1 より小さい) という意味になります。 これで, if文は true になり得ます。 2つ目の間違いは, 「おそらく間違いではないだろうか?」という私の推測です。  if( this._x == _root._xmouse ) this._mc.gotoAndStop(2); この, this._mc.gotoAndStop(2); のターゲットパスが間違っていませんか?  this._mc.gotoAndStop(2);     ↓訂正↓  this..gotoAndStop(2); おそらく,こうだと思います。 // _mc に対する onEnterFrame イベントハンドラの定義 _mc.onEnterFrame = function() { です。 わかりますでしょうか? _mc に対する onEnterFrame イベントハンドラの定義 なのですから, _mc が this です。 もし _mc の中にさらに _mc が存在していれば, この2つ目の間違いはターゲットパス間違いではありません。 単なる私の推測違いです。 次のようにしてください。 --------------------------------------------- // _mc に対する onEnterFrame イベントハンドラの定義 _mc.onEnterFrame = function() { this._x += (_root._xmouse-this._x)/5; // 自分自身の座標がマウス座標の ±1 に入れば if (this._x>=_root._xmouse-1 && this._x<=_root._xmouse+1) { // 自分自身内の _mc を フレーム2 に進ませて止める this._mc.gotoAndStop(2); } else { // 自分自身内の _mc を フレーム1 に進ませて止める this._mc.gotoAndStop(1); } }; ---------------------------------------------

nana_watuki
質問者

お礼

早速やってみたところ問題を解決することができました。 2つ目のターゲットパス問題もご指摘の通り、間違っていました。 Flashのターゲットパスの挿入の機能をそのまま使用していたため気づきませんでした。 ご回答していただきどうもありがとうございました。

関連するQ&A

  • マウスを避けるムービークリップ

    マウスが近づくと逃げるMCを制作しようとしているのですが、 思うようにいかず悩んでいます。 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z という風に並んだそれぞれのアルファベットのMCに マウスが近づくとある一定の範囲の距離を取り、離れると元の場所に戻る… というふうな動きにしたいのです。 今は、 a_mc.onEnterFrame = function () { X=70;//_rootのAのx座標 Y=211;//_rootのAのy座標 var dx = _root._xmouse-this._x; var dy = _root._ymouse-this._y; var kyori = Math.sqrt(dx * dx+dy * dy); var kakudo = Math.atan2(this._y-_root._ymouse,this._x-_root._xmouse); if(kyori<100){ this._x += kyori * Math.cos(kakudo) * 0.05; this._y += kyori * Math.sin(kakudo) * 0.05; this._x = (this._x * 5+X)/6; this._y = (this._y * 5+Y)/6; } }; と記述してマウスと反対方向の動きをさせていますが、 マウスから離れるという動きではないのです…。 分かりづらい説明ですみませんが、ヒントかなにかあれば教えてください。 制作環境は、CS4で、AS2です。

    • ベストアンサー
    • Flash
  • マウスを追いかける

    ムービークリップがマウスを追いかけるというようにしたいのですが、追いかけるムービークリップが別のシンボルの中にあると座標がずれるようで、このずれをなくしたいのですがどのようにすればよいのでしょうか? 詳しくは、シーン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
  • マウスに追従するクリップの範囲について

    はじめて投稿します。初心者ですが、よろしくお願い致します。 マウスに追従するムービークリップについて onClipEvent(enterFrame){ this._x += (_root._xmouse - this._x)/10; this._y += (_root._ymouse - this._y)/10; } としておりますが、マウスがムービーの中に入ったときだけ 反応するようにし、マウスがムービーの外にでるとムービー クリップが定位置に戻るようにしたいのですが よい方法がありましたら教えてください。 定位置に戻るときも追従の流れを残したまま、ゆっくり定位置に 戻るようにしたいと思っております。 よろしくお願いいたします。 Win XP : MX 2004

    • ベストアンサー
    • Flash
  • マウスカーソルに応じたmcのスクロール(ループ型)

    マウスカーソルに応じて、複数配置してるmcがカーソルに合わせてスクロールして、ステージからはみ出したら、はみ出した側のステージの反対から出てくるっていうscriptを作ったのですが、うまくいきません。ループしてくれないんです。 ---- _root ---------------------- menu.mcというのがあり、そのmcの中にmenu01.mc、menu02.mc、menu03.mc・・・という感じでmcが配置してあります。menu.mc自体に別のスクリプト掛けてるので、こういう形にしてます。 ---- _root>menumc ---------------------- menu01.mcなどそれぞれのmenuのmcが入ってます。 さらに、それぞれのmcの中にscroll.mcというのをおき、そのscroll.mcにscriptが書いてあります。 ---- _root>menu.mc>menu01.mc 内scroll.mcのscript------ _visible = false; center = Stage.width/2; halfWidth = _parent._width/2; this.onEnterFrame = function() {  with(_parent){  //Scroll Speed   if (_root._xmouse<=180 || (_root._xmouse>250) && (_root._xmouse<=429)) {    moveX = (center-_root._xmouse)/15;   }else if(_root._xmouse>180 && _root._xmouse<=250){    moveX = 0;   }   _x = _x+moveX;   //Return Scroll   if(_x > Stage.width+halfWidth){    _x -= _width+Stage.width;   }else if(_parent._x < -halfwidth){    _x += _width+Stage.width;   }  } }; --------------------- で、これだときちんと思ったような動きでスクロールはするんですが、ただループしてくれないんです。しかもスクロールする毎にそれぞれのmcの間隔がずれてる気がします。最悪の場合だと、mcの上に別のmcが重なったりしてます。 なぜ、このような現象になってしまうのでしょうか?

  • 3つのムービークリップ再生・巻き戻しの順番制御

    初めまして。 初心者につき、基本的な事だとは思うのですが、調べても分からなかったため、こちらで質問させて頂きたいと思います。 3つのムービークリップ(a_mc,b_mc,c_mc)【フレーム数30】と、 各々を再生させるためのボタン(A,B,C)を使って、 b_mcを再生中にAのボタンを押すと、b_mcを巻き戻した後で、 a_mcを再生するといった感じで3すくみのような状態にしたいのですが、b_mcの巻き戻しとa_mcの再生が同時に行われてしまいます。 現在のActionScriptは以下のようなものなのですが、どなたかご教授願えませんでしょうか? よろしくお願いいたします。 ボタンAのスクリプト on (release) { //Cの巻き戻し _root.c_mc.onEnterFrame = function() { if (this._currentframe>=2) { this.prevFrame();} else {delete this.onEnterFrame} } //Bの巻き戻し _root.b_mc.onEnterFrame = function() { if (this._currentframe>=2) { this.prevFrame();} else {delete this.onEnterFrame} } //BでもCでもないときの判別式? //Aの再生 _root.a_mc.onEnterFrame = function() { if (this._currentframe<=29){ this.gotoAndPlay(this._currentframe); delete this.onEnterFrame} } }

    • ベストアンサー
    • Flash
  • ゲージと連動したムービークリップのアニメーションを動かす方法

    アクションスクリプト初心者です。 サンプルでいただいたムービーを参考に、ファイルを作成しなければならないのですが、うまく動かなくて困っています。 画面に横に長い帯(ゲージ)を置き、その上をマウスで横にスライドさせると、ムービークリップの中のアニメーションがマウスの動きと連動して動くというアニメーションなのですが、うまく動きません。 サンプルでいただいたファイルの帯(ゲージ)の部分、(これもムービークリップです) には -------------------------------------------- onClipEvent (mouseMove) { if (this.hitTest(_root._xmouse, _root._ymouse, true)) { _root.pressure.gotoAndStop(Math.round(((_root._xmouse)/12))); } } -------------------------------------------- と入っていました。 他には、STOPしか入っていませんでした。 数値を変えてみたりしたのですが、アニメーションの途中から動いたり、うまく連動してくれません。 どうやら、サンプルでいただいたムービーと、ファイルサイズが違うことと、新たに作成するファイルは、帯(ゲージ)を画面の右側に置かなければいけないところがうまくいかない原因のひとつかと、わからないながらに思っているのですが・・・; 環境は、Windows2000、FLASHMX2004です。 どなたか、よろしくお願いします。m(__)m

  • ムービークリップ

    ムービークリップをクリックすることによって、 他のムービークリップの位置を変更できますか? もしくは他のムービークリップの複製はできますか? 今はクリックしたムービークリップ(自分自身)の 複製は出来ています。 on (release) { this.duplicateMovieClip("Photo_big", 0); _root.Photo_big._xscale = 80; _root.Photo_big._yscale = 80; _root.Photo_big._x = 350; _root.Photo_big._y = 200; } ちなみに移動したいムービークリップのインスタンス名は text1です。

    • ベストアンサー
    • Flash
  • ドラッグ中の回転を止めたいのですが…

    ドラッグができて,なおかつクリックすると90度回転するようにするため,サンプル集を見てムービークリップ(sikaku_mc)に 次のようなアクションスクリプト(以下AS)を書きました。 もともと解説にあったのですが,これだとドラッグしている最中も 回転してしまいます。クリックすると回転しても ドラッグしているときは回転しないようにするためにはどうすればいいでしょうか。 ちなみにこのASはムービークリップ(sikaku_mc)の編集画面のタイムラインに書き込んだものです。 function onPress() { this.startDrag(false); var xm:Number = this._xmouse; var ym:Number = this._ymouse; this._x = _root._xmouse; this._y = _root._ymouse; sikaku_mc._x -= xm; sikaku_mc._y -= ym; this.onEnterFrame = mawasu; this.onMouseMove = updateStage; } function updateStage() { updateAfterEvent(); } function mawasu() { this._rotation += 90; } this.onRelease = this.onReleaseOutside=stopDragMe; function stopDragMe() { this.stopDrag(); delete this.onEnterFrame; delete this.onMouseMove; } ご教授よろしくお願いします。

    • ベストアンサー
    • Flash
  • カーソルのカスタム

    flash ver.9 AS2.0 使用です。 カーソルを自分で制作したムービークリップ(MC)にする方法を教えていただきたいです。 MCに直接スクリプト onClipEvent (mouseMove) { _x = _root._xmouse; _y = _root._ymouse; } を書く方法は分かるのですが、 知りたいのは フレームアクションで制御する方法です。 多分、とても初歩だと思うのですが、よろしくお願いします。

    • ベストアンサー
    • Flash
  • ムービークリップの階層の問題?

    Flash8を使っています。 質問のタイトルと内容が合致しているのかどうか不安ですが以下のようなことをしようと思っています。  ------------------ | 選択した部品を置く領域choiceMC    ------------------    =================   |  部品を閲覧する領域 buhinMC   |                     ← |  ■   ■   ■   ■   ■    →→   |  部品となるムービークリップ      左右にスクロール   |  インスタンス名はなし   ==================                                →→→次の画面へボタン 部品となるムービークリップが約100個あります。インスタンス名はつけていません。 1画面で表示できないので画面を左右にスクロールして見ることができるようにしました。それがbuhinMCです。 使いたい部品のムービークリップはchoiceMCというムービークリップ上にドラッグアンドドロップをしておきます。 ここまではできているのですが、buhinMCを左右にスクロールをするとchoiceMC上にある部品のムービークリップまでが一緒にスクロールしてしまいます。 choiceMCとヒットした部品のムービークリップは、buhinMCがスクロールした後でも、そのままchoiceMC上に置いておきたいのです。 選択した部品には以下のようなスクリプトが書いてあります。 on (press) { this.startDrag(); } on (release) { this.stopDrag(); if (_root.choiceMC.hitTest(_root._xmouse, _root._ymouse, true)) { my_x = this._x; my_y = this._y; 以下続く これで説明しきれているかどうか分かりませんがどうか教えてください。

    • ベストアンサー
    • Flash

専門家に質問してみよう