- ベストアンサー
マウスの移動方向によってマウスカーソルの画像を切り替える方法
- マウスカーソルの画像を、マウスの移動方向に応じて切り替える方法について教えてください。
- 右向きの車の画像のムービークリップ「car」のインスタンスには、マウスカーソルの座標を取得し、車の画像の表示位置を更新するスクリプトが記述されています。
- マウスのx座標の値の増減を利用して、マウスの移動方向を判断し、それに応じて車の画像を切り替えることができます。
- みんなの回答 (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 」のインスタンスに設定しますから、変数もこの階層に用意すると、ターゲットパスを省略できて便利です。 長くなってすみませんでした。 不明な点がありましたら、補足してください。
お礼
迅速な回答、ありがとうございます。 ご提案いただいた方法で無事実現できました。 説明が大変分かりやすかったです。変数を使って座標の位置の差分を出すのですね。 感謝しております。ありがとうございました!