• ベストアンサー

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

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

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

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

  • ベストアンサー
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

  • ランダムに mcを連続attachMovieさせるアニメ

    MX2004初心者です。 ライブラリにsakura_mc(10フレーム)があります。 さくらの花びらが手前に飛んでくるこまアニメです。 //乱数生成関数 function rndInit(maxNum){   var a = math.random();   var b = Math.ceil( a*maxNum );   return b; }  MC = "sakura"  SW = Stage.width;  SH = Stage.height; this.onEnterFrame = function(){   if( rndInit(10) == 1 ){   count ++;   newName = MC + count;   attachMovie( "sakura_mc", newName, 1 );   //表示位置の設定   this[ newName ]._x = Math.random()*SW;   this[ newName ]._y = Math.random()*SH;    } }  この方法だと、sakura_mcがステージ上ランダムな位置に連続で再生 してくれます。  ただ、二つ以上のsakura_mcを同時にステージに再生はしてくれません。  sakura_mcを同時にいっぱい再生させたい場合はどうすればよいでしょうか?  sakura2_mcをつくって同じ命令を追加してもダメでした。  よろしくお願いします。

    • ベストアンサー
    • Flash
  • mcのドラッグ操作について

    mcのドラッグ制御で悩んでいます。 よく公開されているサンプルでは写真などのmcがり、写真mcを右にドラッグすると写真mc自体も右にスライドしますが、 写真mcを右ドラッグをすると写真mcが左にスライドする仕様を作りたいと思っています。 当方初心者なので詳しくご教授頂けると幸いです。 開発環境はCS3、AS2.0で開発しています。 よろしくお願いします。

    • ベストアンサー
    • Flash
  • ランダムな動きのスピード制御(Flash)

    スクリーンに小花をいくつか配置し、それがスクリーン上をゆらゆらと動くムービーを作りたいと思っています。 ランダムな動きの方が面白いので、本を見ながら下記の様なアクションスクリプトを小花の形のMCに書きました。 しかし、移動速度がものすごく速く、チラチラするだけで全然キレイじゃありません(ToT) どう言うスクリプトを書き加えれば、スピード制御できるでしょうか? onClipEvent(enterFrame){ this._x+=Math.floor(Math.random()*101-50); this._y+=Math.floor(Math.random()*101-50); }

  • ブラウザ取得毎にMCをランダム再生させる方法

    はじめまして。flash初心者のものです。 ブラウザを再取得する度に、再生されるMCが変わる(ランダム再生)様なバナーを作成したいです。考えている方法としては、『1つのswfの中に10個のMCを入れて、それぞれをランダムで再生させる』という事で良いと思っています。10個の外部swfファイルをランダムに読み込ませる方法は色々参考資料があるのですが、サーバーの都合で出来れば1つのswfファイルの中に収めたいのです。 現在、1つのswfファイルの中に、clip1~clip10まで作成してあり、それぞれ200フレームの長さのMCになっています。それぞれclip単体では正常に動作しているので、あとはこれをランダムに再生させたいのですが、どういったActionScriptにしたら良いのでしょうか。 ソフトは『FREE MOTION』 バージョンは『Flash Player 7』になってます。

  • 2つの異なる階層のMCを操作する方法

    WIN=XP SP2 ,Flash8proの環境でオーサリングしています。 質問です。 _root.1_1_mc.1_2_mc.1_3_mc.obje_mc.obje_mc_mc _root.2_1_mc.2_2_mc.player_mc.player_mc_mc.player_mc_mc_mc の上記2つのMCがありまして、 _root.1_1_mc.1_2_mc.1_3_mc.obje_mc.obje_mc_mc はランダムに動いており、 _root.2_1_mc.2_2_mc.player_mc.player_mc_mc.player_mc_mc_mc は、キーボードからの入力によってコントロールされ動いております。 それぞれのMCの座標基準点はすべてばらばらなのですが、 その場合に、キーボードのHキーを押した時のアクションとして、 _root.2_1_mc.2_2_mc.player_mc.player_mc_mc.player_mc_mc_mc が _root.1_1_mc.1_2_mc.1_3_mc.obje_mc.obje_mc_mc を 手に持ったまま動き回れるようにしたいのですが、 座標基準点がばらばらで、試行錯誤いたしましたが 持たせて動き回れる方法が解りません。 ちなみに、ASのみで動作させるには どうしたらよういでしょうか。 どうぞ宜しくお願い致します。

    • ベストアンサー
    • Flash
  • atttachmovie で配置エリアの限定

    actionscript 初心者です。 for文の中で var x:Number = Math.floor(Math.random()*1000)-500; var y:Number = Math.floor(Math.random()*650)-325; _root.space.attachMovie("btn_mc1", "btn_mc"+i,0-i, init); _root.["btn_mc"+i]._x = x; _root.["btn_mc"+i]._y = y; というスクリプトで、btn_mcというmcをランダムに配置しています。 (このスクリプト、間違っているかもです。すみません) 配置位置は今1000px×650pxのステージ中でランダムになっているのですが これを、このステージいっぱいの楕円形があると仮定して その中にだけ、配置するということをスクリプトでできるでしょうか?? つまり、mcがぼんやりと楕円形に集まっている。。というような状態に したいのです。 楕円のマスクをかける、という方法ですと、mcが欠けてしまい、 見栄えがよろしくないです。。 よろしければ、お教えいただけると、幸いです。 お願いいたします m(__)m

    • ベストアンサー
    • Flash
  • ASで降らせた雪のマスクの掛け方について。

    下記のサイトのASを使用させていただき、雪の降るFlashを作成したのですが、 参照サイト : http://www.webdesignlibrary.jp/2006/06/flash_snow.php このスクリプトで降らせた雪を、例えば星型の図形をマスクにして、 その範囲内で雪が降るようにしたいと思い、 色々と丸一日掛けて調べたのですが、全く上手く行きません。 とりあえず、色々と調べてみた結果、 【 xxx.setMask 】 を使えば良いのだろうか・・?、、、と言う所までは 行き着いたのですが、スクリプトを、どう改造?してみても、全く思う結果が得られません。 【 _root.setMask 】 で、ステージ全体を、目的の図形MCでマスクする事で、 思う結果に近しいカタチは出来たのですが、_root.setMask でステージをマスクしてしまうと、 例えば、マスク外に何か画像処理を施したくても、マスク外の画像は全て消えてしまいますし、 その画像の大きさ込みでマスクを作成すると、その画像の上にも雪が降ってしまうので、 完全に行き詰ってしまっています。 ASで降らせた雪だけをマスクする方法はありますでしょうか? どなたか、ご存知の方がいらっしゃいましたらば、 是非にご教示願えますと、大変ありがたいです。  何卒よろしくお願い申し上げますm(_ _)m 以下、使用AS ------------------------------------------------ width = 550; height = 400; total = 200; for (var t = 0; t != total; t++) { var mc = _root.attachMovie("snowflake", "snowflake"+t, _root.getNextHighestDepth()); mc._x = (Math.random()*(width+20))-10; mc._y = (Math.random()*(height+20))-10; mc.yspeed = (Math.random()*1.75)+0.25; mc.speed = (Math.random()*3)+2; mc._xscale = mc._yscale=(mc.speed+mc.yspeed)*10; mc.onEnterFrame = function() { var angle = Math.atan2(_root._xmouse-(width/2), _root._ymouse)+1.5707963267949; this._y += Math.sin(angle)*this.speed+this.yspeed; this._x += Math.cos(angle)*this.speed; if (this._x>width+10) { this._x = -10; } else if (this._x<0-10) { this._x = width+10; } if (this._y>height+10) { this._y = -10; } else if (this._y<0-10) { this._y = height+10; } }; } ------------------------------------------------ 【 AS使用環境 】 Adobe Flash CS3, アクションスクリプト2.0

    • ベストアンサー
    • Flash
  • MCに設定したonPressを他のMCのASから実行する方法

    WIN XP Pro,FLASH8 Pro,FlashPlayer8の環境で開発しております。 質問です。 MCに設定したonPressを他のMCのASから実行する事は可能でしょうか? ステージ内に無数に配置したMC(インスタンス、インスタンス名共にそれぞれのMC毎に異なる)にonPressにて、ASを記載しておいたのですが、 Functionにしておらず、onPressしないと実行させられないため そのonPressによるASをすべてキーダウンのトリガーに変更させる場合、それぞれすべてのASを書き換える事は困難なので、別のMCからキーダウンをトリガーとして、onPressを実行させたいのです。 解説が解り難くて申し訳御座いませんが、噛み砕いて言いますと onPressと記載したMCを実際にクリックさせる事無く ASによってクリックする事(クリックした事)に出来ないかという事なのです。 ちなみに、MC.onPressの返す値をTraceしてみたのですが、Undefindでした。 MC.onPress=trueやMC.onPress=clickなどとしてもダメでした。 もしご存知の方がいらっしゃいましたら、是非ご教授頂ければ 幸いです。 どうぞ宜しくお願い致します。

    • ベストアンサー
    • Flash
  • actionscriptに詳しい方助けてorz

    actionscript3.0を勉強中の初心者です。 現在、フルフラッシュサイトを制作中なのですが、 基本はactionscriptを使用しないで、 作っているのですが、 一部、雪を降らせる演出をactionscriptで実装しています。 そのスクリプトは組めたのですが、 実際にその演出をしたい階層がうまく変更できません。 現状は最前面になっているのですが、 それを最背面の一つ手前にしたいです。 具体的なビジョンとしては 最背面の背景→その上にある画像(部分的に切り抜かれて背景が見えます) この二つの間に雪を降らせたいのですが、 うまくいきません。 何か方法をご存知の方いたら教えていただけると助かります。 スクリプトは下記になります。 addEventListener(Event.ENTER_FRAME , onNewSnow) ; function onNewSnow(eventObj : Event) : void { if (Math.random() <0.3) { var snow_mc:snows = new snows(); snow_mc.x=stage.stageWidth*Math.random(); snow_mc.y=-20; snow_mc.scaleX=snow_mc.scaleY=Math.random()+0.5; addChild(snow_mc); snow_mc.addEventListener(Event.ENTER_FRAME, onSnowStep); } } function onSnowStep(eventObj:Event):void { var target_mc:MovieClip=eventObj.target as MovieClip; target_mc.rotation+=Math.ceil(20/target_mc.scaleX); target_mc.x+=4*Math.random()-2; target_mc.y+=5; if (target_mc.y >(stage.stageHeight+target_mc.height)) { target_mc.removeEventListener(Event.ENTER_FRAME, onSnowStep); removeChild(target_mc); } }

    • ベストアンサー
    • Flash
  • MCを2つ以上ドラッグする方法

    環境は、Flash8,WinXPにて、FlashPlayer8、AS2での書き出しでオーサリングしております。 質問なのですが、 オリジナルマウスポインタを表示させているのですが、 それだと、それで他のMCをドラック&ドロップする事が困難になります。 微妙に動く程度で動きません。 startDrag(true);が競合してしまっている様です。 深度の上層部から下層部へいくつでもドラック&ドロップできたらいいなと思っています。 何か良い改善策はないでしょうか? どうぞ宜しくお願い致します。

    • ベストアンサー
    • Flash

専門家に質問してみよう