- ベストアンサー
画面をランダムに動き回るアクションスクリプト
フラッシュのアクションスクリプト初心者です。 勉強するにあたってまずは下記のようなアクションを作ってみたいんですが どなたか説明していただける方いらっしゃいますでしょうか? PCの画面上を、なんでもいいんですが例えば●という物体がランダムに動き回るアクションスクリプトってどのように記述すればよいでしょうか? 端まで行ってぶつかったらまた違う方向に移動するというようなものです。 方向もランダムで移動するんですが。 宜しくお願い致します。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
ランダムと言っても色々な動きがあるので, よくわかりませんね。 例えば, MCをブラウン運動させたい。 http://oshiete1.goo.ne.jp/qa2544252.html ↑教えて!goo ↓OKWave (同じです) http://okwave.jp/qa2544252.html このご質問↑のように, 「ブラウン運動」 という見たことのあるランダムな動きだと, 「ブラウン運動」 の動画でも一生懸命見て,なんとか再現できる場合もあります。 しかし, なんとなく,このご質問では「ブラウン運動」 のような動きを求めていらっしゃるのではないような気がします。 ※ちなみに上の URL のスクリプトには間違いがあります。 Math.Random() →訂正→ Math.random() です。 というわけで, 以下は,ランダムと言っても色々な動きがあるため, 「ランダムな動き」がどういう動きなのかわからない状態での回答です。 わからないので,一応,3例書きます。 根本的には上の「ブラウン運動」と同様に, ランダムな角度を出して, その角度の方向に 「●という物体」 を動かします。 Flash以前の基礎知識ですが, 角度は,主に2つの表し方があります。 1つは degree(度) 単位の角度の表し方で, もう1つは radian(弧度) 単位の角度の表し方です。 ActionScript では, radian(弧度) 単位の角度がデフォルトです。 また, モニタの座標と同じでステージの左上を (x,y)=(0,0) とした座標になっています。 したがって, degree(度)単位の角度 と,radian(弧度)単位の角度 とは, 次の図のような関係になります。 degree(度)単位の角度 270 ↑ 180←┼→0 (360) ↓ 90 radian(弧度)単位の角度 3/2 π ↑ π←┼→0 (2π) ↓ 1/2 π また,ActionScript では, π や sin や cos の値は次のようにして求められます。 π(= 3.14159……) → Math.PI cos(θ) → Math.cos(θ) sin(θ) → Math.sin(θ) 以上が基礎知識です。 もし,何のことやらさっぱりわからない場合は, 高校数学の教科書か参考書あたりでも再読(?)してみてください。 次に作成手順です。 「●という物体」 を,まずムービークリップに変換します。 変換するときの注意点ですが, 基準点を中央にしてムービークリップに変換してください。 基準点は実際はどこでも良いのですが, 次に示すスクリプトは,ムービークリップの基準点が中央にあると仮定しているスクリプトのため, ムービークリップの基準点は中央にしてください。 そして, ●という物体 のムービークリップ自体を選択して, そのムービークリップ自体に次のようなスクリプトを書けば, 「ステージの端にぶつかったときにランダムな方向に動く向きを変えるムービークリップ」 ができます。 --------------------------- onClipEvent (load) { // スピードの設定 (可変) var spd = 10; // 変数 kaku(角) に 0~2π までの乱数を取得 var kaku = Math.random()*2*Math.PI; } // onClipEvent (enterFrame) { // もしステージ左にぶつかったら if (this._x<=this._width/2) { // 壁に当たった点付近に戻す this._x = this._width/2; // kaku に -1/2π(3/2π)~1/2π までの乱数を取得 kaku = Math.random()*Math.PI-(Math.PI/2); // // もしステージ上にぶつかったら } else if (this._y<=this._height/2) { // 壁に当たった点付近に戻す this._y = this._height/2; // kaku に 0~π までの乱数を取得 kaku = Math.random()*Math.PI; // // もしステージ右にぶつかったら } else if (this._x>=Stage.width-(this._width/2)) { // 壁に当たった点付近に戻す this._x = Stage.width-(this._width/2); // kaku に 1/2π~3/2π までの乱数を取得 kaku = Math.random()*Math.PI+(Math.PI/2); // // もしステージ下にぶつかったら } else if (this._y>=Stage.height-(this._height/2)) { // 壁に当たった点付近に戻す this._y = Stage.height-(this._height/2); // kaku に π~2π までの乱数を取得 kaku = Math.random()*Math.PI+Math.PI; } // // 座標の移動 this._x += spd*Math.cos(kaku); this._y += spd*Math.sin(kaku); } --------------------------- (可変) の付いている行の数値(値)は,適当に変えてください。 上の例は, "ぶつかったとき" にランダムな方向に動く向きを変える ムービークリップのスクリプトです。 ご質問にあるランダムな動きとは, 上のような動きかもしれませんし,違うかもしれません。 「ランダムと言っても色々な動きがあるのでよくわからない。」 と最初に書いたのはそういうことです。 "ぶつかったとき" だけにランダムな方向に動く向きを変えるのではなくて, "ぶつからなくてもたまに" ランダムな方向に動く向きを変える場合は,次のようになります。 --------------------------- onClipEvent (load) { // スピードの設定 (可変) var spd = 10; // 動き方を変える頻度の設定(可変) var freq = 5; // 変数 cnt の初期値 var cnt = 0; // // 変数 kaku(角) に 0~2π までの乱数を取得 var kaku = Math.random()*2*Math.PI; } // onClipEvent (enterFrame) { // もしステージ左にぶつかったら if (this._x<=this._width/2) { // 壁に当たった点付近に戻す this._x = this._width/2; // kaku に -1/2π(3/2π)~1/2π までの乱数を取得 kaku = Math.random()*Math.PI-(Math.PI/2); // // もしステージ上にぶつかったら } else if (this._y<=this._height/2) { // 壁に当たった点付近に戻す this._y = this._height/2; // kaku に 0~π までの乱数を取得 kaku = Math.random()*Math.PI; // // もしステージ右にぶつかったら } else if (this._x>=Stage.width-(this._width/2)) { // 壁に当たった点付近に戻す this._x = Stage.width-(this._width/2); // kaku に 1/2π~3/2π までの乱数を取得 kaku = Math.random()*Math.PI+(Math.PI/2); // // もしステージ下にぶつかったら } else if (this._y>=Stage.height-(this._height/2)) { // 壁に当たった点付近に戻す this._y = Stage.height-(this._height/2); // kaku に π~2π までの乱数を取得 kaku = Math.random()*Math.PI+Math.PI; // // 上記以外のとき(つまり普通のとき) } else { // 変数 cnt に 1 を加算 cnt++; // もし cnt が freq で割り切れたら if (cnt%freq == 0) { // 2πまでの乱数を取得 kaku = Math.random()*2*Math.PI; } } // // 座標の移動 this._x += spd*Math.cos(kaku); this._y += spd*Math.sin(kaku); } --------------------------- この場合は, 本当に無茶苦茶な方向に動く向きを変えます。 ご質問にあるランダムな動きとは, 上のような動きかもしれませんし,違うかもしれません。 上のように, 本当に無茶苦茶な方向に動く向きを変えるのではなくて, ある程度規則性を持ったランダムの場合は次のようになります。 イメージとしては,無雑作に飛び回る蜂のような感じです。 蜂などはランダムに飛び回るとしても, いきなりは飛ぶ向きを変えないわけで, ある範囲内で頭の角度を変えるはずです。 --------------------------- onClipEvent (load) { // スピードの設定 (可変) var spd = 10; // 角度を変える範囲を指定 (可変:例=90度) var dsp = 90; // // 変数 kaku(角) に 0~2π までの乱数を取得 var kaku = Math.random()*2*Math.PI; } // onClipEvent (enterFrame) { // もしステージ左にぶつかったら if (this._x<=this._width/2) { // 壁に当たった点付近に戻す this._x = this._width/2; // kaku に -1/2π(3/2π)~1/2π までの乱数を取得 kaku = Math.random()*Math.PI-(Math.PI/2); // // もしステージ上にぶつかったら } else if (this._y<=this._height/2) { // 壁に当たった点付近に戻す this._y = this._height/2; // kaku に 0~π までの乱数を取得 kaku = Math.random()*Math.PI; // // もしステージ右にぶつかったら } else if (this._x>=Stage.width-(this._width/2)) { // 壁に当たった点付近に戻す this._x = Stage.width-(this._width/2); // kaku に 1/2π~3/2π までの乱数を取得 kaku = Math.random()*Math.PI+(Math.PI/2); // // もしステージ下にぶつかったら } else if (this._y>=Stage.height-(this._height/2)) { // 壁に当たった点付近に戻す this._y = Stage.height-(this._height/2); // kaku に π~2π までの乱数を取得 kaku = Math.random()*Math.PI+Math.PI; // 上記以外のとき(つまり普通のとき) } else { // 指定範囲内で角度を変える kaku += Math.random()*(Math.PI/180*dsp)-(Math.PI/360*dsp); } // // 座標の移動 this._x += spd*Math.cos(kaku); this._y += spd*Math.sin(kaku); } --------------------------- というように, ランダムと言っても色々あります。 勉強するにあたって参考になりましたら利用してみてください。 あと,Flash のバージョンを書かれていませんが。 たまたま,今, 手元に Flash 5 を入れた PC がないため,検証まではしていませんが, 上記スクリプトは Flash 5 以上 (Flash 5 ,MX,MX2004,8) の全て作成可能なスクリプトのはずです。 Flash Player 5 以上にパブリッシュした SWF で閲覧可能です(それは検証済み)。
お礼
もの凄く詳しく有難うございました。 挑戦してみたいと思います。