- 締切済み
マウスの座標
メインのタイムライン1フレーム目です。ストップさせてます。 _rootの中央に、正四角形sikaku_mc(100フレーム)があります。 sikaku_mcの高さ半分より上に、マウスがステージの一番上まで動くにつれて、sikaku_mcが、徐々に再生されて_root._xが0の時、sikaku_mcがフレーム100に到達なるようにしたいのです。 徐々に再生させる事がどうしてもできません。 分かりにくい質問で申し訳ないのですが、宜しくお願いします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
Flash の話というより, 80%くらいは数学(算数)の話ですね。 こういう問題を考える場合は, とりあえず Flash から目を離した方が良いです。 私の場合は PC からも離れて空想(妄想)します。 空想でわからなくなる場合は,紙に空想を落書きします。 すると骨組みができあがるので,あとはコード化するだけです。 >> sikaku_mcの高さ半分より上に… ということなので,sikaku_mc の基準点を中心に設定してください。 デフォルトでは 基準点(+印)が,ムービークリップの中心になるはずですから, 基準点がすでに中心になっていればそれで良いです。 参考URL 「インスタンスの基準点」 http://homepage3.nifty.com/ginga-b/MX/inst_refpoint.html >> _root._xが0の時、sikaku_mcがフレーム100に到達 この 「_root._xが0の時」 の意味がよくわかりませんが, 「ステージに対してのマウスの y座標 が 0 のとき」 と解釈します。 >> 徐々に再生させる事がどうしてもできません これの意味がさらにわかりません。 マウスは常に動くもので,マウスの位置を基準としたフレームまで, gotoAndStop(); させると考えていいのでしょうか? つまりマウスの動きとフレーム数を同期させるということです。 マウスが上に行けば,フレーム100 に近づいて, マウスが下に行けば,フレーム1 に近づくということですが…。 よくわからないので,取りあえず同期で考えます。 とりあえずそう言う前提で, PC からも離れて空想(妄想)する話に戻します。 ご質問で書かれていることを, 空想すると,次の図のようになります。 ┌────Stage─────┐ ┌──MC──┐ □□□□□□□□□□□□□ ~~~ 0 □□□□□□□□□□□□□ □□□■■■■■■■□□□ □□□■■■田■■■□□□ ---MC._y □□□■■■■■■■□□□ □□□□□□□□□□□□□ □□□□□□□□□□□□□ 結局, マウスが MC._y より下のとき フレーム1 に移動させて, マウスが上の端のときに フレーム100 に移動させて, マウスがその間のとき,1~100の間のフレームに移動させれば良いということになります。 これを落書きで数式にすると次のような式になります。 MC再生フレーム =MC全フレーム-((MC全フレーム÷MC._y)×マウスy座標) ここまでできたら, 8割方完成で,後はActionScriptに則ったコードにすれば良いだけです。 コードにすると言っても, マウスが動くたびに「MC再生フレーム」を求めて, その「MC再生フレーム」に gotoAndStop(); すれば良いだけです。 次のスクリプトは, sikaku_mc に書いて(コピペして)ください。 ////////////////////////////////////////////////////////////////// onClipEvent (load) { // とりあえずストップ this.stop(); // 変数 frm の初期値を 1(フレーム) にする var frm = 1; } // マウスが動くと実行 onClipEvent (mouseMove) { frm = Math.ceil(this._totalframes-(this._totalframes/this._y*_root._ymouse)); // フレームを frm フレームに進める this.gotoAndStop(frm); } ////////////////////////////////////////////////////////////////// 上で説明したままのスクリプトですね。 でも説明していない箇所が2つあります。 onClipEvent (mouseMove){ } これはマウスが動くたびに { } 内を実行します。 Math.ceil( ); これは,( )内の数値を整数に切り上げます。 フレーム数は 0 からでなく 1 から始まるので, 小数点以下を切り上げています。 =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*= >> 徐々に再生させる事がどうしてもできません これの解釈がどうしても難しいのですが, 再生させるということは,バックしないということでしょうか? 上のスクリプトだと, マウスとMCのフレームは同期するので,マウスを下に下げれば,バック(逆再生)します。 もし逆再生はさせたくないのでしたら, マウスの座標の一番上のときのフレームの値を記録しておいて, その最高値を上回ったときだけ動かすようにすれば良いです。 温度計で言うと,気温を計る最高温度計みたいなしくみでしょうか。 次のスクリプトも, sikaku_mc に書く(コピペする)スクリプトです。 ////////////////////////////////////////////////////////////////// onClipEvent (load) { // とりあえずストップ this.stop(); // 変数 frm1 と frm2 の初期値を 1(フレーム) にする var frm1 = frm2=1; } // マウスが動くと実行 onClipEvent (mouseMove) { frm1 = Math.ceil(this._totalframes-(this._totalframes/this._y*_root._ymouse)); // frm1 と frm2 を比べて 大きい方を frm2 に記録 frm2 = Math.max(frm1, frm2); // フレームを frm2 フレームに進める this.gotoAndStop(frm2); } ////////////////////////////////////////////////////////////////// 新たに登場するのが frm2 = Math.max(frm1, frm2); です。 Math.max(A,B) は A と B を比べて大きい方の数値を返します。 その他Mathクラスのメソッドに関しての参考URL 「Mathクラス」 http://www.1art.jp/flash/le/lesson33/lesson33.htm frm2 = Math.max(frm1, frm2); ですから,frm1と frm2 を比べて,大きい方を再び frm2 に代入します。 その frm2フレームに gotoAndStop(); するので,バックはしません。 =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*= なお,この考え方(上の方のスクリプトの考え方)を使うと, ( ) ( ) ( こんな↑形のモーションガイドに沿った, オブジェクトの y軸方向マウス追従 も可能になります。 モーションガイドのみについての参考URL 「第11回 トゥイーンのさらに便利な機能」 http://itpro.nikkeibp.co.jp/article/COLUMN/20060609/240470/ 勝手な解釈の部分も入れていますが, 以上のような感じでOKでしょうか? なお, 上記スクリプトを作成する前からわかっていたことなのですが, Flash の宿命で,マウスを高速移動させて, Flash 表示エリア外に出た場合, マウス座標は変なところの値で途切れます。 この点はご容赦ください。
お礼
くわしい説明ありがとうございました。 さっそく試してみたいと思います。