• 締切済み

ActionScript3.0 雪を降らせる方法

はじめまして! Flashを勉強し始めたばかりの初心者ですが 雪のインスタンスを作成し、ステージの上から下へランダムな大きさで(ぼかしも入れつつ)降ってくるムービーを作りたいと思っています。 色々検索した結果、下記サンプルソースを発見したので とりあえず、 「snow_mc」というムービークリップをflaファイルのライブラリに格納し ParticleSimulatorクラスをリンゲージ設定後、 下記フレームアクションに追加したのですが、、、雪が降ってきません・・ var Snowdrop = new ParticleSimulator(); addChild (Snowdrop); エラーもでてこないのでどこをどう直せばいいかわらず困っております・・ まったくのど素人で申し訳ありませんが どなたかご教授いただけるととっても助かります! ちなみに、使用したクラスは下記です。 <ParticleSimulatorクラス> package{ import flash.display.*; import flash.events.*; public class ParticleSimulator extends Sprite{ private static var GRAVITY:Number = 9.8; private static var ro:Number = 1.205; private static var nyu:Number = 0.00001512; private var myImage:Class; private static var w:int = 685; private static var h:int = 455; public function ParticleSimulatorR(){ var bitmap:Bitmap = new myImage(); addChild(bitmap); for(var i:int = 0 ; i < 100 ; i++){ var l:Number = Math.random() * 0.000005; var p:Particle = new Particle(l*1500000); p.x = w*Math.random(); p.y = h*Math.random(); p.alpha = Math.random()/2 + 0.4; p.diameter = l; p.mass = l * 10; addChild(p); p.addEventListener(Event.ENTER_FRAME, loop); } } public function loop(e:Event):void{ var p:Particle = Particle(e.target); p.t++; p.vy = Math.pow((p.mass * GRAVITY) / (3 * Math.PI * ro * nyu * p.diameter), (1 - Math.exp(-3*Math.PI*ro*nyu* p.diameter * p.t/ p.mass))); //p.x += 1; p.y += p.vy; // マウスからの距離 var distance:Number = Math.sqrt((mouseX - p.x)*(mouseX - p.x) + (mouseY-p.y)*(mouseY-p.y)); // 加速度(距離が近いほど大きく、質量が大きいほど小さく) p.ax = (400 / distance) * 0.1 / (p.mass * 1000000); if(mouseX > p.x) p.ax *= -1; p.vx += p.ax; p.x += p.vx; if(p.x > w || p.y > h){ p.x = w*Math.random(); p.vx = p.ax = 0; p.y = 0; p.t = 0; } } } }

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

みんなの回答

回答No.2

Tanigucchiです。 Flex でのAS3.0の例ですが参考URLのもので動作します。(Flex SDK 3.0 で検証済み) それぞれのスクリプトを   ParticleSimulator.as   Particle.as   MovingObject.as として保存してビルドしてみてください。 Flashであれば、ParticleSimulator.as の MyImage の部分を合わせて あげれば動作すると思われます。(未検証です)

参考URL:
http://yamasv.blog92.fc2.com/blog-entry-51.html
hatenawave
質問者

お礼

Tanigucchiさん、返信が遅くなり申し訳ありません! ありがとうございます! 実はちょっと別件でたてこんでおりまして・・ 教えていただいたのにまだ試してません。 後日、結果をご連絡させていただきます。 ありがとうございます!!

回答No.1

なんとなく、myImageクラスに画像が埋め込まれていないように感じますので以下を試してください。 private var myImage:Class; の前の行に [Embed(source="backimage.jpg")] //backimage.jpg:背景画像 ところで提示されたソースには Particle の定義 がありませんが そちらは問題ありませんか?

hatenawave
質問者

お礼

Tanigucchiさん、アドバイスをありがとうございます! お礼が遅くなって大変申し訳ございません。 Particleの定義・・そうですね、ないですね。 ちょっと、参考したものがよくなかったのかも知れません。。 よくよく、見てみますと public function ParticleSimulatorR(){ の部分はコンストラクタなので public function ParticleSimulator(){ となるはずの気もします。 うーん。AS3となるとなかなかオープンソースがなくて。。 地道に、本で調べたりするしかないのかもしれません(@_@;)

関連するQ&A

  • actionscript 3.0 初心者です

    以下の3つの質問にご回答いただければ幸いです。 以下の参考にさせていただいている、スクリプトにて 1、random関数の()の後に来る数字はどのような範囲を意味しているのでしょうか? 2、sList[i].vx = Math.random() -0.5;という記述について、これはあるオブジェクトの 落下(進行)の速度を示しているらしいのですが、その手前の記述で、 private var vx:Number = 0;という記述があります。自分で定義したものをプロパティーとして使い事はできるのでしょうか?(もしくわこのvxはarrayのプロパティとして使われていると考えてよろしいのしょうか?) 3、なぜ速度をわざわざ配列で記入する必要があるのでしょうか? 多岐にわたっておりますが、是非よろしくお願い致します。 package{ import flash.display.Sprite; import flash.display.MovieClip; import flash.geom.Matrix; import flash.events.Event; import flash.filters.BlurFilter; public class Main extends Sprite { private var snow:Ball;     private var num:int = 200; private var sList:Array = []; private var vx:Number = 0; public function Main(){ for(var i:int = 0; i < num; i++){ var snow:Ball = new Ball(2,0xaaffff) //初期位値 snow.x = Math.random() * stage.stageWidth; snow.y = Math.random() * stage.stageHeight; //大きさを生成順に小さく snow.scaleX = snow.scaleY = 1 / (0.02 * i + 1); //配置して配列に入れる addChild(snow); sList.push(snow); //それぞれのx方向の速度設定 sList[i].vx = Math.random() -0.5; } addEventListener(Event.ENTER_FRAME,go1); } private function go1(evt:Event):void{ for(var i = 0; i < num; i++){ //x方向とy方向の動き設定(奥のものほど遅くなる) sList[i].x += sList[i].vx / (0.02 * i + 1); sList[i].y += 4 / (0.02 * i + 1); //ステージ外(下)に出たら移動 if(sList[i].y > 400){ sList[i].x = Math.random() * stage.stageWidth; sList[i].y = 0; } } } } }

    • ベストアンサー
    • Flash
  • ActionScript3.0について…

    ある課題で下記の条件を満たしたものを制作するというものがありまして、 制作してみたんですが、回答例と異なっていました。 私が制作したものでは、なにか間違っているのか分かりませんので質問させていただきました。よろしくお願いいたします。 ☆☆☆ 条件 ☆☆☆ ★ _mcの移動幅を5~10もしくは-10~-5の範囲になるようにします。 ★ 縦方向、横方向ともにステージの端まで移動したら反転するようにします。 ※ステージ幅は400px、高さは300pxとします。 ※条件ではありませんが、この問題を解くヒントとして、 「移動幅は2分の1の確率で-1を掛ける」と 「2分の1を表す条件式の例としては[ Math.random < 0.5 ]が考えられます。」とあります。 ☆☆☆ 回答例 ☆☆☆ var stepX:int = Math.floor(Math.random() * 6) + 5; var stepY:int = Math.floor(Math.random() * 6) + 5; if (Math.random() < 0.5){ stepX *= -1; } if (Math.random() < 0.5){ stepY *= -1; } _mc.addEventListener(Event.ENTER_FRAME, xEnterFrame); function xEnterFrame(evt) { _mc.x += stepX; _mc.y += stepY; if (_mc.x >= 400 || _mc.x <= 0){ stepX *= -1; } if (_mc.y >= 300 || _mc.y <= 0){ stepY *= -1; } } ☆☆☆ 私が書いたもの ☆☆☆ var stepX:int = Math.floor(Math.random() * 6) + 5; var stepY:int = Math.floor(Math.random() * 6) + 5; _mc.addEventListener(Event.ENTER_FRAME, xEnterFrame); function xEnterFrame(evt) { _mc.x += stepX; _mc.y += stepY; if(_mc.x > 400 || _mc.x < 0){ stepX *= -1; } if(_mc.y > 300 || _mc.y < 0){ stepY *= -1; } } あくまでもヒントでしたので、私が書く際にはヒントを見ずに書きました。

    • ベストアンサー
    • Flash
  • actionscript3.0 初心者です。

    ある円の半径を、マウスカーソルのX座標に対応させて変化させよう思い、以下の記述を行ったのですが、プレビューにて全く何も表示されません。お心当たりあれば是非教えていただきたいです。やはり、半径の値をiの形で代入させるようにしたことが無理矢理だったのでしょうか。よろしくお願いします。 package { import flash.display.Sprite; import flash.events.Event; public class boin extends Sprite {  public function boin() { var _maru:Sprite = new Sprite(); var i:Number = new Number();    _maru.graphics.beginFill(0xFF0000);    _maru.graphics.drawCircle(0,0,i);    _maru.graphics.endFill();    _maru.x = 100;    _maru.y = 200;    addChild(_maru);  addEventListener(Event.ENTER_FRAME,boo);  {   function boo(event:Event):void    {     _maru.x = mouseX;     i = mouseX;     }   } } } } ASファイル(boin)

    • ベストアンサー
    • 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
  • Flash ActionScript 3のエラー

    下記のコードについて、エラーがわからず困っています。 上から13行目の(stage.addChild(background)に対して、 Error Message: "Cannot access a property or method of a null object reference." がでます。 この13行目までは、ちゃんと動いていたのに、これ以降コードを加えていくと、 動きません。 お分かりになる方、どうぞ教えてください。 まだ初心者(2週間)なので、初歩的な質問かもしれませんが、よろしく お願いします。 [コード] import flash.display.MovieClip; import flash.display.Stage; import flash.events.Event; public class GameEngine extends MovieClip { public function GameEngine() { super(); //create background and add to stage var background:Background = new Background(); stage.addChild(background); background.x = 500 / 2; background.y = 400 / 2; //create fly and add to stage var fly:Fly = new Fly(stage); stage.addChild(fly); fly.x = 100; fly.y = 400 / 2; //creat new enemy objects addEventListener(Event.ENTER_FRAME, createEnemy, false, 0, true); } private function createEnemy(e:Event):void{ if(Math.floor(Math.random() * 90) == 5){ var enemy:FlySwatter = new FlySwatter(stage); } } } (行はじめの } の余白が入力した通りに表示されませんので、余白は無視してください)

  • ActionScript3.0の質問です

    このようなプログラムも考えました。 デバッグではエラーは出ませんでしたが、論理的、プログラム的に問題はありますでしょうか? function fl_GenerateRandomNumber(limit:Number):Number { var randomNumber:Number = Math.floor(Math.random()*(limit+1)); return randomNumber; } var xxx:Number=fl_GenerateRandomNumber(3); Button_1.addEventListener(MouseEvent.CLICK, fl_ClickToGoToAndStopAtFrameButton); function fl_ClickToGoToAndStopAtFrameButton(event:MouseEvent):void { if(xxx==0) {this.gotoAndStop(3);} else {this.gotoAndStop(7);} } function fl_GenerateRandomNumber2(limit:Number):Number { var randomNumber:Number = Math.floor(Math.random()*(limit+1)); return randomNumber; } var xxx2:Number=fl_GenerateRandomNumber2(3); Button_2.addEventListener(MouseEvent.CLICK, fl_ClickToGoToAndStopAtFrame2Button); function fl_ClickToGoToAndStopAtFrame2Button(event:MouseEvent):void { if(xxx2==1) {this.gotoAndStop(4);} else {this.gotoAndStop(7);} }

    • ベストアンサー
    • Flash
  • 雪の降るスクリプトで、、、

    以前雪の降るスクリプトについて質問させていただいたものです。 フレームには、 for (k=0; k<50; k++) { duplicateMovieClip(this.snow, "snow"+k, k); } で、ムービークリップには、 onClipEvent (load) { //specifies the size of the movie stage movieWidth = 300; movieHeight = 200; //variables that will modify the falling snow i = 1+Math.random()*2; k = -Math.PI+Math.random()*Math.PI; //giving each snowflake unique characteristics this._xscale = this._yscale=50+Math.random()*100; this._alpha = 75+Math.random()*100; this._x = -10+Math.random()*movieWidth; this._y = -10+Math.random()*movieHeight; } onClipEvent (enterFrame) { //putting it all together rad += (k/180)*Math.PI; this._x -= Math.cos(rad); this._y += i; if (this._y>=movieHeight) { this._y = -5; } if ((this._x>=movieWidth) || (this._x<=0)) { this._x = -10+Math.random()*movieWidth; this._y = -5; } } これを再生するといきなりステージに現れてしますのですが、 ステージの上からY座標Oから(上から降るように)するにはどう したらよいでしょうか? onClipEvent (load)に this._y = 0; と付け加えてみましたが駄目でした。 ご教授お願いいたします。

    • ベストアンサー
    • Flash
  • 雪が降るスクリプトについて

    雪がふるスクリプトを http://www.kirupa.com/developer/mx/snow.htm で拾ったのですが、flashplayer6対応のようで、 これをflashplayer7対応にするにはどうしたらよいのでしょうか? フレームには、 for (k=0; k<50; k++) { duplicateMovieClip(this.snow, "snow"+k, k); } で、ムービークリップには、 onClipEvent (load) { //specifies the size of the movie stage movieWidth = 300; movieHeight = 200; //variables that will modify the falling snow i = 1+Math.random()*2; k = -Math.PI+Math.random()*Math.PI; //giving each snowflake unique characteristics this._xscale = this._yscale=50+Math.random()*100; this._alpha = 75+Math.random()*100; this._x = -10+Math.random()*movieWidth; this._y = -10+Math.random()*movieHeight; } onClipEvent (enterFrame) { //putting it all together rad += (k/180)*Math.PI; this._x -= Math.cos(rad); this._y += i; if (this._y>=movieHeight) { this._y = -5; } if ((this._x>=movieWidth) || (this._x<=0)) { this._x = -10+Math.random()*movieWidth; this._y = -5; } } とあるようですが。

    • ベストアンサー
    • Flash
  • FLASHの出力エラーについて

    FLASHの出力エラーの原因がわかりません。 プレビューを押したとき ArgumentError: Error #2004: パラメータの 1 つが無効です。 at flash.display::Graphics/drawRect() at _fla::MainTimeline/xClick() とでてしまいます。 詳しい方、ご教授お願い致します。 ↓アクションスクリプトです add_btn.addEventListener(MouseEvent.CLICK, xClick); function xClick(evt) { var num1:Number = Number(in1_txt.text); var num2:Number = Number(in2_txt.text); var h:Number; if (num1 < 18) { h = 60; } else if ((num1 >= 18) && (num1 < 20)) { h = 50; } else if ((num1 >= 20) && (num1 < 23)){ h = 40; } var black:Number; if (num1 < 18) { black = (0xb0c4de); } else if ((num1 >= 18) && (num1 < 20)) { black = (0x8e9db2); } else if ((num1 >= 20) && (num1 < 23)) { black = (0x66707f); } else if ((num1 >= 23) && (num1 < 26)) { black = (0x232933); } else if(num1 > 25) { black = (0x232933); } var iro:Number; if (num1 < 18) { iro = 0.3;; } else if ((num1 >= 18) && (num1 < 20)) { iro = 0.4; } else if ((num1 >= 20) && (num1 < 23)){ iro = 0.5; }else if (num1 >50){ iro = 1.0; } var color:Number; if ((num2 >= 18) && (num2 <=25)){ color = (Math.random() * 0xffffff); } else if ( (num2 >=40) && (num2 <= 50)) { color = (0x999966); } else if(num1 > 50){ color = (0x996633); } else { color = (Math.random() * 0xffffff); } var k:Number; if ((num1 >= 23) && (num1 < 25)) { var mae:Shape=new Shape(); mae.graphics.beginFill(color); mae.alpha = 0.5; mae.graphics.drawRect(645 ,410, 310, 30); mae.graphics.endFill(); addChild(mae); for( y = 455 ; y <= 770 ; y = y + 255 ) { var ye:Shape=new Shape(); ye.graphics.beginFill(black); ye.graphics.drawRect(645 ,y, 310, 35); ye.graphics.endFill(); addChild(ye); } for( y = 505 ; y <= 700 ; y = y + 55 ) { var shima:Shape=new Shape(); shima.graphics.beginFill(color); shima.alpha = 0.5; shima.graphics.drawRect(645 ,y, 310, 28); shima.graphics.endFill(); addChild(shima); } } var m:Number; if (num1 >= 25) { var bod:Shape=new Shape(); bod.graphics.beginFill(color); bod.alpha = 0.5; bod.graphics.drawRect(645 ,410, 310, 10); bod.graphics.drawRect(645 ,490, 310, 10); bod.graphics.drawRect(645 ,660, 310, 20); bod.graphics.drawRect(645 ,685, 310, 5); bod.graphics.endFill(); addChild(bod); for( y = 430 ; y <= 700 ; y = y + 265 ) { var rec:Shape=new Shape(); rec.graphics.beginFill(black); rec.graphics.drawRect(645 ,y, 310, 50); rec.graphics.endFill(); addChild(rec); } for( y = 500 ; y <= 655 ; y = y + 40 ) { var ran:Shape=new Shape(); ran.graphics.beginFill(color); ran.alpha = 0.5; ran.graphics.drawRect(645 ,y, 310, Math.random()*30); ran.graphics.endFill(); addChild(ran); } }

  • actionscript 3.0 勉強中のもです

    numChildrenから出した値をつかって実験中です。 以下の記述に置いて、contaner1.numChildrenの数値(結果:2)をif構文の条件式に使おう したところうまく行きません。if(container1.numChild == 2)にしてみると、読み込み専用ですと言われてしまいます。どのように考えたらよろしいのでしょうか?お心当たりありましたら是非よろしくお願い致します。 import flash.display.Sprite; var container1:Sprite = new Sprite(); var container2:Sprite = new Sprite(); var counter:Sprite = new Sprite(); var circle1:Sprite = new Sprite(); var n:Number= new Number; circle1.graphics.lineStyle(10,0x3355bb,); circle1.graphics.drawCircle(40, 50, 40); var circle2:Sprite = new Sprite(); circle2.graphics.beginFill(0x00CCFF); circle2.graphics.drawCircle(80, 90, 40); var circle3:Sprite = new Sprite(); circle3.graphics.beginFill(0x7766FF); circle3.graphics.drawCircle(60, 40, 40); container2.addChild(container1); container1.addChild(circle1); container1.addChild(circle2); addChild(circle1); addChild(circle3); trace(container1.numChildren); // 2 trace(container2.numChildren); // 1 trace(circle1.numChildren); // 0 trace(circle2.numChildren); n = container1.numChildren if(n == 2)//container1.numChildrenの数を代入値として使いたい。 { circle1.x=300 }

    • ベストアンサー
    • Flash

専門家に質問してみよう