package { import flash.display.DisplayObjectContainer; import flash.geom.Point; // twoD の他に threeD がある。 import org.flintparticles.common.initializers.ScaleImageInit; import org.flintparticles.common.displayObjects.RadialDot; import org.flintparticles.common.initializers.ImageClass; import org.flintparticles.twoD.actions.DeathZone; import org.flintparticles.twoD.actions.Move; import org.flintparticles.twoD.actions.RandomDrift; import org.flintparticles.twoD.initializers.Position; import org.flintparticles.twoD.initializers.Velocity; import org.flintparticles.twoD.renderers.DisplayObjectRenderer; import org.flintparticles.twoD.zones.LineZone; import org.flintparticles.common.counters.Steady; import org.flintparticles.twoD.emitters.Emitter2D; import org.flintparticles.twoD.zones.PointZone; import org.flintparticles.twoD.zones.RectangleZone; public class Snow { private var _target:DisplayObjectContainer; private var _width:Number; private var _height:Number; private var _snowfall:int; private var _speed:int; private var _minScale:int; private var _maxScale:int; private var _sizeX:int; private var _sizeY:int; private var emitter:Emitter2D; private var renderer:DisplayObjectRenderer; public function Snow(target:DisplayObjectContainer,width:Number,height:Number,snowfall:int=150,speed:int=65,minScale:Number=0.75,maxScale:Number=2,sizeX:int=20,sizeY:int=20) { _target = target; _width = width; _height = height; _snowfall = snowfall; _speed = speed; _minScale = minScale; _maxScale = maxScale; _sizeX = sizeX; _sizeY = sizeY; } private function init(steady:int):void { /* パーティクルの管理者 (http://2px.cc/2blog/2008/04/emitter.html) (http://2px.cc/2blog/2008/06/flintversion103.html) */ emitter = new Emitter2D(); //パーティクルをどのように放つか? (http://2px.cc/2blog/2008/03/flintcounters.html) emitter.counter = new Steady(steady); } private function setting(w:Number,h:Number,sd:int,minS:int,maxS:int,sX:int,sY:int):void { // emitter に、さまざまな初期設定を加えていく。 (http://2px.cc/2blog/2008/03/flintinitializers.html) // /* パーティクル自体の DisplayObject を Class で指定。 2 は RadialDot に渡す引数 (http://2px.cc/2blog/2008/03/flintdisplayobjects.html) (http://2px.cc/2blog/2008/03/post-3.html) */ emitter.addInitializer(new ImageClass(RadialDot, 2)); /* パーティクルの初期位置 (Position(zone:Zone))、パーティクルの速度 (Velocity(zone:Zone)) (http://2px.cc/2blog/2008/03/flintzones.html) 速度(Velocity) を範囲(Zone) で表す */ emitter.addInitializer(new Position(new LineZone(new Point(0, -5), new Point(w, -5)))); // X方向は速度0、Y方向は速度 sd emitter.addInitializer(new Velocity(new PointZone(new Point(0, sd)))); // パーティクルの拡大率 (ScaleImageInit(minScale:Number, maxScale:Number)) emitter.addInitializer(new ScaleImageInit(minS, maxS)); /* emitter に、さまざまな動きをつけていく (http://2px.cc/2blog/2008/03/flintactions.html) (http://2px.cc/2blog/2008/03/flintactions-2.html) (http://2px.cc/2blog/2008/06/flintactions-3.html) */ // ActionやInitializerの設定に基づき、パーティクルを移動させる (http://2px.cc/2blog/2008/03/flintactions.html) emitter.addAction(new Move()); /* パーティクルが対象ゾーン内(外)にある時、パーティクルを消す。 (DeathZone(zone:Zone, zoneIsSafe:Boolean = false)) (http://2px.cc/2blog/2008/03/flintactions.html) trueの時、対象ゾーン外にあるパーティクルを消す。 */ emitter.addAction(new DeathZone(new RectangleZone(0, -5, w, h),true)); /* パーティクルにランダムな移動を設定 (RandomDrift(sizeX:Number, sizeY:Number)) (http://2px.cc/2blog/2008/03/flintactions-2.html) */ emitter.addAction(new RandomDrift(sX, sY)); } private function render(tg:DisplayObjectContainer):void { /* emitter を表示させるレンダー (http://2px.cc/2blog/2008/06/flintversion103.html) */ // パーティクルを DisplayObject として表示する Renderer (表示者)。 renderer = new DisplayObjectRenderer(); // Renderer に Emitter を追加 renderer.addEmitter(emitter); // Renderer を表示させる tg.addChild(renderer); } public function start():void { // emitter と counter init(_snowfall); // addInitializer と addAction setting(_width, _height, _speed, _minScale, _maxScale, _sizeX, _sizeY); // render render(_target); // Emitter をスタートさせる。 (http://2px.cc/2blog/2008/04/emitter.html) emitter.start(); } public function pause():void { emitter.pause(); } public function restart():void { emitter.resume(); } public function stop():void { emitter.stop(); } public function remove(target:DisplayObjectContainer ):void { target.removeChild(renderer); } public function runAhead(skip:int):void { /* Emitterを指定時間後にスキップさせます。 runAhead(time:Number, frameRate:Number = 10) (http://2px.cc/2blog/2008/04/emitter.html) サンプルでは 10 */ emitter.runAhead(skip); } // getter & setter // public function get snowfall():int { return _snowfall; } public function set snowfall(value:int):void { _snowfall = value; } public function get speed():int { return _speed; } public function set speed(value:int):void { _speed = value; } public function get minScale():int { return _minScale; } public function set minScale(value:int):void { _minScale = value; } public function get maxScale():int { return _maxScale; } public function set maxScale(value:int):void { _maxScale = value; } public function get sizeX():int { return _sizeX; } public function set sizeX(value:int):void { _sizeX = value; } public function get sizeY():int { return _sizeY; } public function set sizeY(value:int):void { _sizeY = value; } } }