• ベストアンサー

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

以下のようにスクリプトを書いたのですが ムービークリップがマウスカーソルと同じ位置に来ても ムービークリップがフレーム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); }; どうすればこの問題を解決することができるのでしょうか。 ご存知の方がおられましたらご回答をよろしくお願いします。

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

  • ベストアンサー
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

専門家に質問してみよう