• ベストアンサー

画面をランダムに動き回るアクションスクリプト

フラッシュのアクションスクリプト初心者です。 勉強するにあたってまずは下記のようなアクションを作ってみたいんですが どなたか説明していただける方いらっしゃいますでしょうか? PCの画面上を、なんでもいいんですが例えば●という物体がランダムに動き回るアクションスクリプトってどのように記述すればよいでしょうか? 端まで行ってぶつかったらまた違う方向に移動するというようなものです。 方向もランダムで移動するんですが。 宜しくお願い致します。

  • Flash
  • 回答数1
  • ありがとう数2

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

  • ベストアンサー
noname#35109
noname#35109
回答No.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 で閲覧可能です(それは検証済み)。  

maman5
質問者

お礼

もの凄く詳しく有難うございました。 挑戦してみたいと思います。

関連するQ&A

  • Flashのアクションスクリプトで物体を動かす

    ネットで画面を表示させたときにフラッシュのアクションスクリプト使って1つの物体で同じ動作を繰り返させるソースを教えていただけないでしょうか?  またそのような情報扱っているサイトや本などがあれば紹介していただけないでしょうか? お願いします。

  • action scriptについて

    Flashでaction scriptを勉強したいと思っています。 Paraflaかfrimoが良いと思ってるのですがどちらが使いやすいのでしょうか? また、flashdevelopとflex sdkでFLASHを作れるようなのですがその2つでアニメーションを作ることは可能ですか? 宜しくお願いします。

  • FLASHアクションスクリプトに注釈文

    Windows2000 FLASH MX のアクションスクリプトを勉強はじめました。 色々のサンプルを参考にして理解できたことをアクションスクリプトの記述の中に注釈文として残しておきたいのですが、注釈文の記述の方法がわかりません。 文頭に ! や ’や ”をつけてみましたがエラーになります。 それともFLASHのエディタではAccessVBAやHTMLタグのように記述できないのでしょうか。

  • Action Script3.0でプルダウンメー

    Flash勉強中4週目の初心者です。 Action Script3.0でプルダウンメニュー(ポップアップメニュー)を作りたいのですが、詳しい方がいましたら教えてください。 フラッシュで動画を作り、最後にアイコンが並ぶようにしました。アイコンをマウスオーバーでプルダウンメニューがでて、それぞれのカテゴリーにリンクをさせたいのですが、WEBで調べてもAction Script3.0でつくるプルダウンメニューがあまりなく、行き詰っています。 どなたかAS3.0のスクリプトが、初心者にも分かりやすく出ているサイト、もしくはサンプルスクリプトなどがありましたら教えて下さい。設置の仕方等、全くわかりませんので、詳しく知りたいのです。 独学でマニュアルをもとに勉強しています。自分ひとりではやはり限界がありますので、悩んでいます。よろしくお願い致します。

    • ベストアンサー
    • Flash
  • Action Script 3.0

    Flashの初心者です。 Action Script 3.0を使用したいのですが、 MX2004を使用しているので、使えません。 移行ツールかフリーのソフトはありますでしょうか?

  • FLASHのアクションスクリプトを簡単に

    アクションスクリプトってどんなものか簡単に教えて下さい。 FLASH2で止まりで、これからFlashMXの勉強を始めようと思ったので。 よろしくおねがいします!

  • Action Scriptで

    フラッシュのいろいろのデザインがのってる本で勉強しているんですが、 そのなかのアクションスクリプトの記述に、 onClipEvent (enterFrame) { if (part) { nextFrame(); } else { prevFrame(); } } と書いてある部分がありまして、ifの後のカッコ内の "part"というのがどうしてもわからない・・んです。 べつにどのインスタンス名にもpartと書いていないし、、 if→part というのは、何をしているんでしょうか?? すいません。だれか教えてください。

    • ベストアンサー
    • Flash
  • アクションスクリプト3.0の記述方法

    下記アクションスクリプト2.0以前での記述方法を 3.0での記述にするにはどのような記述にしたらよろしいのでしょうか? 世は親タイムラインの2フレーム目に移動したいのです。 初歩的な事で申しわけないのですがどなたかご教授ください 宜しくお願いします。 ------------------------- _root.gotoAndStop(2); -------------------------

    • ベストアンサー
    • Flash
  • アクションスクリプト?

    はじめまして、質問失礼致します…。 最近FLASHを始めたのですが、とても気になるサイト様がありまして どのように作っているのかヒントだけでも教えていただければと思い 書き込みさせて頂きました。 多分初心者の言葉よりも見ていただいた方が早いと思うので 下記に気になるサイトさんのURLを張らせていただきます。 http://www.kazsh.com/ の#11 Letter effectsがそうなのですが、これもアクションスクリプト というものなのでしょうか? アクションスクリプトで検索をかけてもなかなか めぼしい物が見つからず、検索ワードも違ってるのかとも思い このまま探してもみつからなさそうなので…。 もし、この手の効果が載っている本でおすすめ等もありましたら 教えていただけたら幸いです。 と堅苦しくなりましたが、実際のとこほんと気になって 夜も眠れません(笑) どなたかご教授よろしくお願いいたしますーm(_ _)m

    • ベストアンサー
    • Flash
  • FLASHのアクションスクリプトについて

    FLASHのアクションスクリプトを勉強したいのですが、 何かよい本やWebサイトはありますでしょうか。 (日本語のものがよいです) どうか教えてください、よろしくお願いいたします。

専門家に質問してみよう