- ベストアンサー
FLASHのActivescriptでオブジェクトを任意の場所に動かしたい。
こんにちは。 FLASHのActivescriptをつかって、 動かしているムービークリップの●(まる)を クリックすると指定の場所に●が移動するscriptが わからなくて、とても困ってしまっています。 どなたかおわかりになる方がいらっしゃいましたら、 教えてください。よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
クリックした時のムービークリップの位置を覚えておき、他のフレームでは、その位置から指定の位置に移動していく、といった動作でよろしいでしょうか? まず、ムービークリップの位置に関してですが。 クリックされた時の位置を、変数に保存しておきます。保存する座標は、マウスカーソルの位置でも、ムービークリップの座標でも構いません。 再生するキーフレームが変わると、同じムービークリップでも、前のフレームにあったムービークリップで利用していた変数がクリアされてなくなってしまうことがあります。 変数の値を違うフレームで利用する時は、フレームを移動しても変数がなくならない、メインのタイムライン( _root 階層)に変数を用意するといいでしょう。 例えば、フレーム1にあるムービークリップをクリックした時は、 on(release) { //現在のマウスカーソルの位置を保存 _root.clip_x = _root._xmouse; _root.clip_y = _root._ymouse; } このようにすると、フレーム1でムービークリップをクリックした時のマウスカーソルの位置を、変数 clip_x と clip_y に保存しておくことができます。上記のスクリプトでは、これらの変数は _root 階層に定義されます。 _xmouse や _ymouse の代わりに this._x と this._y の値を代入すれば、クリックした時のムービークリップの座標を保存できます。 クリックして、例えばフレーム2に移動したとします。 フレーム2にもムービークリップが配置されているかと思います。 ムービークリップがステージに登場した時、load というイベントが発生します。普通は1度きりのイベントですので、変数の初期化や関数の定義などのように1度だけ実行したい処理は、load イベントを利用すると便利です。 load イベントを利用して、フレーム1で保存しておいた場所にムービークリップを移動しますと、その位置が移動開始場所になります。 モーショントゥイーンでムービークリップが移動して見えるのは、座標が連続して変化しているためです。 ActionScript でも、座標を保持する _x や _y プロパティがあります。これを連続して変化させると、ムービークリップが移動していくアニメになります。 ムービークリップの enterFrame イベントは、ムービークリップがステージに存在している間、フレームレート分の1秒ごとに発生しています。移動するアニメをスクリプトで作るには、このイベントを利用して、連続的に座標を更新します。 移動の計算には様々な方法があります。 ここではとりあえず、移動先とムービークリップの位置から距離を出し、その間を 10 フレームで移動する方法をご紹介します。 この方法ですと、ムービークリップがどこにあっても必ず 10 フレームで移動するので、移動速度は一定ではありません。移動先との距離が長いほど速く、近いほど遅く移動します。 一定の速度で移動する場合は、距離に応じて、移動にかかるフレーム数が変動します。 (数学や物理で習う、速度の計算と同じ原理です) 移動先も動いている場合や、目標との角度から速度を出したい場合は、もう少し数学の話が必要になります。ここでは割愛しますが、三角関数をヒントにして考えてみてください。 いずれの場合も、enterFrame を利用して、座標に速度を加算し、連続的に座標を変化させることには変わりありません。ただ、加算する速度が、ある決まった数にするか、計算で出しているかの違いだけです。 enterFrame イベントは、先述の通り、ムービークリップがステージに存在している間はずっと発生しています。 目的の場所まで移動した後も、勝手に移動されたのでは困りますよね。 そこで、変数を1つ用意して、移動をするかしないかの指令を出すようにします。 普段はこの変数を管理し、移動指令が出ている時だけ、移動の処理を実行します。目的の位置に達した時は移動指令をクリアしておくと、それ以上は移動しなくなります。 スクリプトにしますと、大体、次のようになります。 /*初期設定*/ onClipEvent(load) { //前フレームでの位置に移動 this._x = _root.clip_x; this._y = _root.clip_y; //移動先の座標 target_x = 10; target_y = 10; //移動ステップ数を保持:10フレームで移動 move_step = 10; //移動先との距離から速度を求める vx = ( target_x - this._x ) / move_step; vy = ( target_y - this._y ) / move_step; //移動フラグ:移動時true、それ以外はfalse move_flg = true; } /*常に実行する処理*/ onClipEvent( enterFrame ) { //移動指令が出ている場合のみ、目標に向かって移動 if( move_flg ) { this._x += vx; this._y += vy; //目標の座標に達したら、移動終了 if( vx <= 0 ) { //指定の位置を超えないようにする if( this._x <= target_x ) { this._x = target_x; this._y = target_y; //移動を終了する move_flg = false; } } else { //指定の位置を超えないようにする if( this._x >= target_x ) { this._x = target_x; this._y = target_y; //移動を終了する move_flg = false; } } } } 目標の位置まで移動したかどうかを判断する時は、速度の符号にご注意ください。 目標がムービークリップの移動開始位置のどの方向にあるかによって、水平方向および垂直方向の速度の符号が違います。そのため、目標の位置に移動したかどうかを判定する条件の不等号の向きも異なります。 なお、今回は 10 フレームの移動ですので、X座標が目標の位置に達した時はY軸方向の移動も終了したものと見なしています。 スクリプトで動きを付ける時のポイントは、座標の計算の仕方です。 座標の計算はムービークリップの動き方に影響を及ぼします。今回は単純に一定の速度を加算していく直線的な動きですが、高度な数学や物理の運動方程式を使うと、幾何学的な面白い動きや慣性のある動きなどを作ることも可能です。 長くなってすみませんでした。
その他の回答 (1)
- DPE
- ベストアンサー率85% (666/776)
Flash MX 以降をお使いであれば、ムービークリップに //クリックした時の処理 on(release) { // ( 10 , 10 ) の位置に移動 this._x = 10; this._y = 10; } (↑このスクリプトをコピーして使う場合は、各行頭の全角のスペースを、全て半角のスペースかタブに置き換えてください。このまま使うとシンタックスエラーになります) というスクリプトを設定してみてください。クリックした時、指定の位置にムービークリップが移動します。 位置を 10 や 100 のように決まった数字ではなく、変数や計算式を利用して指定すると、タイムラインではできない面白い動きを作ることもできます。 Flash 5 では、ムービークリップに on アクションを設定するとシンタックスエラーになり、クリックを検出することができません。 同様のことをするには、ムービークリップの中に透明なボタンを重ねておき、このボタンにonアクションを設定する方法などがあります。
補足
大変親切なご回答ありがとうございました! ただ、1つこちらの説明不足だったのですが、 移動の仕方が、 指定した座標部分に「パッ」と移動するのではなく、 モーショントゥイーンのように、クリックした位置から 指定の場所(例えば x=10 y=10)にスーっと移動していく方法です。 例えば、クリックしてフレーム(シーン)移動させて、 そこに置いてある●の移動開始位置に、 クリックした位置の座標情報を当て込む、 といったことなど不可能でしょうか?? 大変説明不足ですみませんでした。 よろしくお願い致しますm(__)m
お礼
お返事ありがとうございます。 とてもわかりやすく、丁寧にお返事いただき、 その内容で、無事に、動かすことができました。 何か、マニュアル関係のお仕事に従事されて いたりするのでしょうか?本当にわかりやすく しかも、見返りもない、サイトでここまで 丁寧にお返事がいただけたこと、本当に ありがたいです。 動かすことができた瞬間は涙が出そうなほど 嬉しかったです。本当に感謝の言葉が 思いつかないほど嬉しいです。 自分のスキル不足を真摯に受け止めて、今後は もっともっと勉強して回答できる側に回れるように なりたいと思います。 DPE様、本当にありがとうございました。