• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:マウスの移動方向によってマウスカーソルの画像を切り替えたい)

マウスの移動方向によってマウスカーソルの画像を切り替える方法

このQ&Aのポイント
  • マウスカーソルの画像を、マウスの移動方向に応じて切り替える方法について教えてください。
  • 右向きの車の画像のムービークリップ「car」のインスタンスには、マウスカーソルの座標を取得し、車の画像の表示位置を更新するスクリプトが記述されています。
  • マウスのx座標の値の増減を利用して、マウスの移動方向を判断し、それに応じて車の画像を切り替えることができます。

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

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

前回のマウスカーソルのX座標を変数に保存しておき、mouseMove イベント発生時に、現時点でのマウスカーソルのX座標との差が正か負かを判断して向きを変える、という方法はいかがでしょう。 まず、オリジナルのカーソルとなるムービークリップ「 car 」ですが。 フレーム1に右向き、フレーム2に左向きの車の画像を配置したムービークリップを作ります。 マウスカーソルの向きを変数で管理します。仮にこの変数を cursor_ptt とし、1の時右向き、2の時左向き、というように値を決めます。 すると、  this.gotoAndStop( cursor_ptt ); というアクションで、右向き・左向きを簡単に切り替えられるようになります。 次はマウスが移動した方向を判断する処理です。 変数を1つ用意し、前回のマウスカーソルのX座標を保存します。 普段は mouseMove イベント発生時のマウスカーソルのX座標を入れます。最初の1回は、ムービークリップがステージに登場した時に発生する load イベントを利用して、その時のマウスカーソルのX座標を保存しておきます。 mouseMove イベントが発生した時、変数に保存されている座標(前回の座標)と、この時点でのマウスカーソルの座標の差を計算すると、その正負でどちらの向きに移動したかが分かります。 この結果が正の時は右に移動、負の時は左に移動したと見なすことができます。 カーソルの絵はフレームに分けており、そのフレームは cursor_ptt という変数で管理しています。差が正の時は1、負の時は2を入れ、gotoAndStop アクションで絵を切り替えられるようにします。 ところで、今回はX座標だけで向きを決めますが、1つ問題になるのが、差分が0だった時、つまり、マウスを真上か真下方向に動かした時は、カーソルの向きをどちらにするか、です。 スクリプトの上では、0の時の向きを左右どちらかに決めることも可能です。しかし、前回の向きと違う方向に決めた場合はカーソルがちらつき、見苦しくなることがあります。 そこで、ここでは、0の時は前の向きをそのまま採用するものとにします。 以上の考え方を元にスクリプトを組みますと、次のようになります。 (↓このスクリプトをコピーして使う場合は、各行頭の全角のスペースを、全て半角のスペースかタブに置き換えてください。このまま使うとシンタックスエラーになります)  /*初期設定*/  onClipEvent(load)  {   //カーソルのパターンを保持   //1:右向き 2:左向き   cursor_ptt = 1;   //前回のカーソルのX座標を保持   //初期値は現時点のカーソルのX座標   prev_x = _root._xmouse;   //マウスカーソルを消す   Mouse.hide();   //最初に表示する向きを設定   this.gotoAndStop( cursor_ptt );   //カーソルの位置に表示   this._x = _root._xmouse;   this._y = _root._ymouse;  }  /*マウスの動きとともに、カーソルのパターンを変える*/  onClipEvent(mouseMove)  {   //前回のカーソルの位置との差から、向きを決める   //差が正の時:右向き 負の時:左向き 0の時:変更なし     if( ( _root._xmouse - prev_x ) > 0 )   {    cursor_ptt = 1;   }   else if( ( _root._xmouse - prev_x ) < 0 )   {    cursor_ptt = 2;   }   //今のカーソルのX座標を保存   prev_x = _root._xmouse;   //向きを設定し、カーソルの位置に表示   this.gotoAndStop( cursor_ptt );   this._x = _root._xmouse;   this._y = _root._ymouse;   updateAfterEvent();  } 今回は変数が2つ出てきます。 変数はどの階層に用意してもいいのですが、スクリプトをムービークリップ「 car 」のインスタンスに設定しますから、変数もこの階層に用意すると、ターゲットパスを省略できて便利です。 長くなってすみませんでした。 不明な点がありましたら、補足してください。

Y-z
質問者

お礼

迅速な回答、ありがとうございます。 ご提案いただいた方法で無事実現できました。 説明が大変分かりやすかったです。変数を使って座標の位置の差分を出すのですね。 感謝しております。ありがとうございました!

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

関連するQ&A

  • マウス 追従 範囲外

    マウスを追いかけるMCを以下のように設定しましたが、 MCが動いている範囲外にマウスがいるときは追いかけるのを やめにしたい場合どのように記述すればよろしいでしょうか。  onClipEvent (mouseMove) { if (_root._xmouse >左 && _root._xmouse <右) { this._x = _root._xmouse; } if (_root._ymouse >上&& _root._ymouse <下) { this._y = _root._ymouse; } } 範囲外にマウスがいるときは定位置にmcを表示させるか、 表示を消したいです。 ちなみにmcが動く範囲の指定方法はネット上から探してきました。 別の方法でもっと適した記述があれば教えてください。

  • カーソルのカスタム

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

    • ベストアンサー
    • 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
  • AS2をAS3にしたい

    AS2で書かれたスクリプトの一部があります。下記をAS3にしたいのですが。 ちなみに、mcはインスタンス名です。  onClipEvent (load) {      pointX = 10;     pointY = 20;  }  onClipEvent (mouseMove) {       _root.mc._x = _root._xmouse + pointX;       _root.mc._y = _root._ymouse + pointY;     }

    • ベストアンサー
    • Flash
  • 線の描画

    使用ソフトはFlashMX2004でMacOSXを使用しています。 線の描画なんですが、他の動きとの関係で マウス位置より85上に線を描画→描画の度に新しいMCを作る→最初に作られたMCから透明になって消える という流れを目指して制作しています。 表現の関係上、btとリンケージ名をつけたボタンを1度押し、離した時に描画位置を指定し、再びボタンを押した時に描画終了という動きをさせたいと思い、以前頂いたサンプルに手を加え var osi = 0; canvases = 0; bt.onPress = function() { canNum++; if (osi == 1 &&_root._xmouse>=28 && _root._xmouse<=470 && _root._ymouse>=22 && _root._ymouse<=500) { _root.createEmptyMovieClip("can"+canvases, canvases); _root["can"+canvases]._alpha = 50; _root["can"+canvases].lineStyle(4, 0xffffff); _root["can"+canvases].lineTo(_root._xmouse, _root._ymouse-85); _root["can"+canvases].onEnterFrame = function() { this._alpha--; if (this._alpha<1) { this.removeMovieClip(); } }; updateAfterEvent(); canvases++; osi = 0; }; bt.onRelease = function() { if (osi == 1 &&_root._xmouse>=28 && _root._xmouse<=470 && _root._ymouse>=22 && _root._ymouse<=500) { _root["can"+canvases].moveTo(_root._xmouse, _root._ymouse-85); } } }; というスクリプトをくみましたが描画されません。 私が手を加えた箇所が間違っているのでしょうか。 一応試行錯誤はしてみたんですが解決策が見当たらず・・・。 間違っていましたらご指摘お願いします。 また、解決策がありましたらご教授お願いします。 このスクリプトがてを加える前の状態です。 this.stop(); canNum = 0; var osi = 0; canvases = 0; bt.onPress = function() { canNum++; if (_root._xmouse>=28 && _root._xmouse<=470 && _root._ymouse>=22 && _root._ymouse<=500) { mX = _root._xmouse; mY = _root._ymouse; osi = 1; } else { osi = 0; } }; bt.onRelease = function() { if (_root._xmouse>=28 && _root._xmouse<=470 && _root._ymouse>=22 && _root._ymouse<=500) { if (osi>0) { _root.createEmptyMovieClip("can"+canvases, canvases); _root["can"+canvases]._alpha = 50; _root["can"+canvases].lineStyle(4, 0xffffff); _root["can"+canvases].moveTo(mX, mY); _root["can"+canvases].lineTo(_root._xmouse, _root._ymouse-85); _root["can"+canvases].onEnterFrame = function() { this._alpha--; if (this._alpha<1) { this.removeMovieClip(); } }; updateAfterEvent(); canvases++; osi = 0; } } }; 長くなってしまい申し訳ありません。

  • 外部swfを読み込んだときだけMouse.hide();させたい。

    よろしくお願いします。 ドキュメント上に空のムービークリップを作り、その中の入れ子のボタンを押すと外部swfを表示するflashを作ったのですが、その外部swf、仮にhoge.swfを読みこんで、そのときだけマウスを隠して(ムービークリップをマウス代わりに)、ボタンで違う外部swf、仮にogeをよみこんだときはマウスを表示させることは可能でしょうか? onClipEvent (enterFrame) { this._x=_root._xmouse; this._y=_root._ymouse; Mouse.hide(); } 上記のスクリプトでマウスを消すと、ogeを読み込んでもマウスが消えっぱなしです。 多分if文を使って if (hogeを読み込んだら){ this._x = _root._xmouse; this._y = _root._ymouse; Mouse.hide(); } //そうでなかったら、 else { Mouse.show(); } みたいな感じなのでしょうが、うまく機能しません・・・。 ご教授お願い致します。

    • ベストアンサー
    • Flash
  • マウスに追従するクリップの範囲について

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

    • ベストアンサー
    • Flash
  • 格納式の動くメニューとヒット領域判定について

    ロゴをさわると格納されていたメニューがモーションを伴いながらでて、そのまま消えずに維持、一定以上左のエリアにいってしまうとメニューが消えるメニューを作りたいと思っています。 http://fashion.dior.com/dior.html イメージとしてはこちらのどれかリンクを選んでいただいて各コンテンツを表示させるメニューをクリックした時の動きが近いです。 格納→維持→エリア外にいくと消えるしくみまではなんとか作れたのですが、不思議なことにメニューが現れるときにモーションをともなわず、最後のフレームだけが再生されるようになってしまいました。 なお、ロゴには下記のスクリプトをつけました。 ヒットテストにしていないのはその後も条件をつけるためにはヒットテストだとできない?かなと思ったからです。 onClipEvent (mouseMove) { if (this._parent._xmouse>749.6 && this._parent._xmouse<966.6 && this._parent._ymouse<228.6 && this._parent._ymouse>28.6) { this._parent.menu.gotoAndPlay(2); } else if (this._parent._xmouse<698.9) { this._parent.menu.gotoAndStop(1); } else { this._parent.menu.gotoAndStop(7); } } 表示させるメニューのムービークリップ(menu)には onClipEvent (mouseMove) { if (this._parent._xmouse>698.9) { this.gotoAndStop(7); } else if (this._parent._xmouse<698.9) { this.gotoAndStop(1); } } と書きました。 かなり無理矢理なスクリプトだと思いますがご教授お願いします。! ちなみに制作環境はflashMX2004です。

  • Flashで、ナビゲーションがマウスカーソルに追従し、カーソルに近づくと止まるボタン

    FlashのActionScriptについての質問です。 参考書を見ながらやっていて、 ナビゲーションがマウスカーソルに追従し、カーソルに近づくと止まるボタンを作りたいのですが、 マウスに追従してきません。 _rootタイムラインのムービークリップctr_mcsetに、 onClipEvent (enterFrame) { if (_root.woksctr == true) { this._x += (_parent._xmouse-this._x)/5; this._y += (_parent._ymouse-this._y)/5; } } を記述しました。 ctr_mcsetのタイムラインに、触れると追従が止まるボタンの領域として、 cl_bn02を配置して、クリッカブル表示されないように on (release) { } onClipEvent (load) { this.useHandCursor = false; } を記述しました。 その、cl_bn02のタイムラインに、_up,_over,_downラベルをつくり、 _upには、 stop(); this.hitArea = hit; this.hit._visible = false; _root.worksctr = true; _over,_downには、 _root.worksctr = false; と記述しました。 参考書の通りだと、これでマウスカーソルにナビゲーションが近づくと静止し、 離れると追従するらしいのですが、止まったまま追従してきません。 if (_root.woksctr == true)の、==を、=だけにすると、追従はしてきますが、 ムービークリップの中心点にマウスカーソルがいつもいってしまって、 左右のボタンがうまく押せません。 どこか記述がヘンなのでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • ポップアップを一定時間、またはマウスが乗っている間表示させておく

    スクリプトに詳しくないので、教えていただきたいです。 画面上のあるエリアにマウスをのせるとポップアップウィンドウのようなものが表示され、 その中にあるボタンをクリックすると外部swfを読み込むという仕組みを 作りたいと思っています。 下に書いてあるスクリプトでポップアップが出てくるようにしたのですが、 その次がわからなくて困っています。 (1)マウスがエリアから外れても、一定時間(例えば1秒とか)ポップアップを 表示したままにしたい (2)ポップアップにマウスがのっている間は表示させておきたい (1)はエリア部分とポップアップが離れている場合(といってもほんの少しです)を 考えてのことです。 いい方法がありましたらぜひ教えてください。 どうぞよろしくお願いいたします。 エリア部分に書いたActionScript --------------------------------------------------------------- onClipEvent (load) { _root.popup._visible = false; } onClipEvent (enterFrame) { if (this.hitTest(_root._xmouse,_root._ymouse,1)) { _root.popup._visible = true; } else { _root.popup._visible = false; } } ---------------------------------------------------------------

    • ベストアンサー
    • Flash
彼氏に別れを告げられました
このQ&Aのポイント
  • 彼氏に突然別れを告げられて、私は頭が回らず何も言えなかった。
  • 彼との関係に距離感が生まれてしまった原因を知りたい。
  • 付き合ってすぐの頃は優しくしてくれていた彼に、最近は違った態度が出てきた。
回答を見る

専門家に質問してみよう