• ベストアンサー

MCをブラウン運動させたい。

MCをブラウン運動させる(擬似的にしているように見える)方法を 教えて下さい。 Math.Random()で制御を試みてみたものの、ブラウン運動らしさが どうしても出せません。 MCは10pix程度の小さな正円です。 開発環境はMacOSX10.4.7 Flash8です。 よろしくお願いします。

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

  • ベストアンサー
noname#35109
noname#35109
回答No.1

学生の頃,テレビ放送かビデオで, 花粉のブラウン運動を見たきりで, その動き方のイメージにあまり自信がありませんが, すごく単純で良いのであれば, 10pix程度の小さな正円のMCに次のように書けば良いと思います。 ------------------------------- onClipEvent (enterFrame) { // 2πまでの乱数を取得 var kaku = Math.Random()*2*Math.PI; // 座標の移動 this._x += 2*Math.cos(kaku); this._y += 2*Math.sin(kaku); } ------------------------------- サイン・コサイン・タンジェントのアレです。 ただし角度はラジアンです。 また,Flash での y座標 は, モニタのy座標と同じで,下向きがプラスです。 ですから,上下が反転した座標軸をイメージしてくだされば良いと思います。 もう少し, ギザギザ運動の度合を滑らかにしたり, スピード(1フレームで進む距離)などもカスタマイズしたい場合は, 値を変数化して置く方がカスタマイズしやすくなります。 そのカスタマイズ可能バージョンが次のスクリプトです。 同じく,10pix程度の小さな正円のMCに書いてください。 ------------------------------- onClipEvent (load) { // スピードの設定 (可変) var spd = 2; // 動き方を変える頻度の設定(可変) var freq = 2; // 変数 cnt の初期値 var cnt = 0; } onClipEvent (enterFrame) { // もし cnt が freq で割り切れたら if (cnt%freq == 0) { // 2πまでの乱数を取得 var kaku = Math.Random()*2*Math.PI; } // 座標の移動 this._x += spd*Math.cos(kaku); this._y += spd*Math.sin(kaku); // 変数 cnt に 1 を加算 cnt++; } ------------------------------- この, var spd = 2; や var freq = 2; の 2 を変化させれば,カスタマイズ可能です。 しかし,上のままでしばらく放っておくと, ステージ領域から消えてしまう場合があります。 それで,ステージの枠まで来たら折り返すスクリプトを加えたのが次のスクリプトになります。 ------------------------------- onClipEvent (load) { // スピードの設定 (可変) var spd = 2; // 動き方を変える頻度の設定(可変) var freq = 2; // 変数 cnt の初期値 var cnt = 0; } onClipEvent (enterFrame) { // もし cnt が freq で割り切れたら if (cnt%freq == 0) { // 2πまでの乱数を取得 var kaku = Math.Random()*2*Math.PI; // もし x座標が ステージより左に出そうであれば if (this._x<=this._width/2) { // 角度を右方向へ var kaku = 0; // もし x座標が ステージより右に出そうであれば } else if (this._x>=Stage.width-(this._width/2)) { // 角度を左方向へ var kaku = Math.PI; // もし y座標が ステージより上に出そうであれば } else if (this._y<=this._height/2) { // 角度を下方向へ var kaku = Math.PI/2; // もし y座標が ステージより下に出そうであれば } else if (this._y>=Stage.height-(this._height/2)) { // 角度を上方向へ var kaku = Math.PI*3/2; } } // 座標の移動 this._x += spd*Math.cos(kaku); this._y += spd*Math.sin(kaku); // 変数 cnt に 1 を加算 cnt++; } ------------------------------- ごちゃごちゃ書きましたが, 3つ書いたスクリプトのうち, 一番大切なのが,最初のスクリプトです。 あとはカスタマイズしやすくして, ステージから消えそうになった場合の処理を入れてみただけです。 つまり3つ目はエラー処理のようなものの部分が大半を占めているだけです。

din1451
質問者

お礼

ありがとうございます。 ご回答頂いたスクリプトを元に変数を調整 (微振動している様に見えるレベルまで細かく設定)して フレームレートを高く設定することで限りなく質の高い ブラウン運動の再現ができました。 spd、freq変数を組み込んで頂いたおかげでより理想的な再現ができたのだと思います。 途方にくれていたので本当に助かりました。 ありがとうございました。

関連するQ&A