[Stardust] Spawn
...
@author paq89
/**
* Copyright paq ( http://wonderfl.net/user/paq )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/sG5H
*/
// forked from paq's [Stardust] HANABI
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.TimerEvent;
import flash.utils.Timer;
import idv.cjcat.stardust.common.clocks.ImpulseClock;
import idv.cjcat.stardust.common.renderers.Renderer;
import idv.cjcat.stardust.twoD.emitters.Emitter2D;
import idv.cjcat.stardust.twoD.renderers.DisplayObjectRenderer;
/**
* ...
* @author paq89
*/
[SWF( width=465, height=465, frameRate=60, backgroundColor=0xFFFFFF)]
public class Main extends Sprite
{
private var emitter:Emitter2D;
private var renderer:Renderer;
private var container:Sprite;
private var clock:ImpulseClock;
public function Main()
{
// パーティクルを格納するスプライトを作成。
container = new Sprite();
addChild(container);
// clock.impulse()が呼び出された時に発生するパーティクルの数
clock = new ImpulseClock(1);
// エミッターを作成
emitter = new MyEmitter(clock, container);
// レンダラーを作成
renderer = new DisplayObjectRenderer(container);
renderer.addEmitter(emitter);
// Timer を使って一定期間ごとにパーティクルを作成
var timer:Timer = new Timer(1000);
timer.addEventListener(TimerEvent.TIMER, tick);
timer.start();
tick(null);
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
private function onEnterFrame(e:Event):void
{
emitter.step();
}
private function tick(e:TimerEvent):void
{
// パーティクル作成
clock.impulse();
}
}
}
import flash.display.*;
import flash.events.Event;
import idv.cjcat.stardust.common.actions.Action;
import idv.cjcat.stardust.common.actions.Age;
import idv.cjcat.stardust.common.actions.CompositeAction;
import idv.cjcat.stardust.common.actions.DeathLife;
import idv.cjcat.stardust.common.actions.ScaleCurve;
import idv.cjcat.stardust.common.actions.triggers.ActionTrigger;
import idv.cjcat.stardust.common.actions.triggers.DeathTrigger;
import idv.cjcat.stardust.common.actions.triggers.LifeTrigger;
import idv.cjcat.stardust.common.clocks.Clock;
import idv.cjcat.stardust.common.events.ActionEvent;
import idv.cjcat.stardust.common.initializers.Life;
import idv.cjcat.stardust.common.initializers.Mask;
import idv.cjcat.stardust.common.initializers.Scale;
import idv.cjcat.stardust.common.math.UniformRandom;
import idv.cjcat.stardust.twoD.actions.Damping;
import idv.cjcat.stardust.twoD.actions.Gravity;
import idv.cjcat.stardust.twoD.actions.Move;
import idv.cjcat.stardust.twoD.actions.Spawn;
import idv.cjcat.stardust.twoD.emitters.Emitter2D;
import idv.cjcat.stardust.twoD.fields.UniformField;
import idv.cjcat.stardust.twoD.initializers.DisplayObjectClass;
import idv.cjcat.stardust.twoD.initializers.DisplayObjectParent;
import idv.cjcat.stardust.twoD.initializers.Position;
import idv.cjcat.stardust.twoD.initializers.Velocity;
import idv.cjcat.stardust.twoD.zones.LazySectorZone;
import idv.cjcat.stardust.twoD.zones.SinglePoint;
/**
* エミッター
* @author paq
*/
class MyEmitter extends Emitter2D
{
public function MyEmitter(clock:Clock, container:Sprite)
{
super(clock);
//-- イニシャライザーを追加
addInitializer(new DisplayObjectParent(container)); //
addInitializer(new DisplayObjectClass(Dust)); // パーティクルのアイテムを指定
addInitializer(new Position(new SinglePoint(465 / 2, 465 / 2))); // パーティクルの位置を指定
addInitializer(new Velocity(new LazySectorZone(15, 3))); // パーティクルにかかる力を指定
addInitializer(new Life(new UniformRandom(50, 10))); // パーティクルのライフを指定
addInitializer(new Scale(new UniformRandom(2, 0.1))); // パーティクルのスケールを指定
//-- アクションを作成
var actions:CompositeAction = new CompositeAction();
actions.mask = 1 | 2;
actions.addAction(new Age()); // 寿命を有効化
actions.addAction(new DeathLife()); // 消えるを有効化
actions.addAction(new Move()); // 移動を有効化
actions.addAction(new ScaleCurve(0, 10)); // スケール変化を有効化
actions.addAction(new Damping(0.07)); // 減速を有効化
addAction(actions);
//-- スポーンを作成
var spawn:Spawn = new Spawn(new UniformRandom(1, 0)); // スポーンを作成
spawn.addInitializer(new Mask(2)); // マスクを指定
spawn.addInitializer(new DisplayObjectClass(Dust2)); // パーティクルのアイテムを指定
spawn.addInitializer(new Velocity(new LazySectorZone(10, 2))); // パーティクルにかかる力を指定
spawn.addInitializer(new Life(new UniformRandom(40, 15))); // パーティクルの開始ライフを指定
spawn.addInitializer(new Scale(new UniformRandom(1, 0.4))); // パーティクルの開始スケール値を指定
addAction(spawn);
}
}
/**
* パーティクル
* @author paq
*/
import flash.display.Sprite;
import frocessing.color.ColorHSV;
class Dust extends Sprite {
static private var col:int = 180;
public function Dust() {
var color:ColorHSV = new ColorHSV(col+=2, 0.7);
graphics.beginFill(color.value, 0.5);
graphics.drawCircle(0, 0, 16);
graphics.beginFill(color.value, 1);
graphics.drawCircle(0, 0, 8);
blendMode = BlendMode.ADD;
}
}
class Dust2 extends Sprite {
static private var col:int = 100;
public function Dust2() {
var color:ColorHSV = new ColorHSV(col+=1, 0.7);
graphics.beginFill(color.value, 0.5);
graphics.drawCircle(0, 0, 16);
//blendMode = BlendMode.ADD;
}
}