Burster:
If you don't want to create random particles as Stardust does, you can use bursters to create particles with properties of exact given values.
如果你不想像星尘那样去创建随机粒子,你可以使用bursters来创建拥有确定值的粒子。
定义的方法一半是抽象方法,需要子类去实现,一半是final方法,不能被子类重写。
例子:
发射器:PointUniburstEmitter.as
package {
import idv.cjcat.stardust.common.actions.Age;
import idv.cjcat.stardust.common.actions.DeathLife;
import idv.cjcat.stardust.common.actions.ScaleCurve;
import idv.cjcat.stardust.common.clocks.Clock;
import idv.cjcat.stardust.common.initializers.Life;
import idv.cjcat.stardust.twoD.actions.Move;
import idv.cjcat.stardust.twoD.actions.Oriented;
import idv.cjcat.stardust.twoD.actions.RandomDrift;
import idv.cjcat.stardust.twoD.actions.Snapshot;
import idv.cjcat.stardust.twoD.emitters.Emitter2D;
public class PointUniburstEmitter extends Emitter2D {
public function PointUniburstEmitter(clock:Clock) {
super(clock);
//actions
addAction(new Age());
addAction(new DeathLife());
addAction(new Oriented());
addAction(new ScaleCurve(0, 90));
addAction(new RandomDrift(0.2,0.25));
addAction(new Move(0.5));
addAction(new Snapshot());
}
}
}
ArrowBurster:
package {
import idv.cjcat.stardust.common.initializers.Alpha;
import idv.cjcat.stardust.common.initializers.Color;
import idv.cjcat.stardust.common.initializers.Life;
import idv.cjcat.stardust.common.initializers.Mass;
import idv.cjcat.stardust.common.math.UniformRandom;
import idv.cjcat.stardust.twoD.bursters.PointUniburster;
import idv.cjcat.stardust.twoD.initializers.DisplayObjectClass;
public class ArrowBurster extends PointUniburster {
public function ArrowBurster() {
count = 10;
x = 320;
y = 240;
speed = 5;
addInitializer(new DisplayObjectClass(Ball));
addInitializer(new Life(new UniformRandom(60, 0)));
addInitializer(new Alpha(new UniformRandom()));
addInitializer(new Color(0xff00ff));
addInitializer(new Mass(new UniformRandom()));
}
}
}
主程序:
Test3.as
package
{
import flash.display.Sprite;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.TimerEvent;
import flash.geom.Rectangle;
import flash.utils.Timer;
import idv.cjcat.stardust.common.clocks.ImpulseClock;
import idv.cjcat.stardust.common.clocks.SteadyClock;
import idv.cjcat.stardust.common.emitters.Emitter;
import idv.cjcat.stardust.twoD.display.AddChildMode;
import idv.cjcat.stardust.twoD.handlers.DisplayObjectHandler;
import net.hires.debug.Stats;
public class Test3 extends Sprite
{
protected var stats:Stats;
protected var container:Sprite;
protected var emitter:Emitter;
private var burster:ArrowBurster;
public function Test3()
{
stage.scaleMode = StageScaleMode.NO_SCALE;
root.scrollRect = new Rectangle(0, 0, 640, 480);
this.stage.frameRate = 50;
stats = new Stats();
addChild(stats);
this.container = new Sprite();
addChild(container);
burster = new ArrowBurster();
//创建时钟,创建发射器。发射器内部add Action。
emitter = new PointUniburstEmitter(new SteadyClock());
emitter.particleHandler = new DisplayObjectHandler(container,AddChildMode.BOTTOM);
this.addEventListener(Event.ENTER_FRAME,onEnterFrame);
var timer:Timer = new Timer(100);
timer.addEventListener(TimerEvent.TIMER, burst);
timer.start();
}
private function burst(e:TimerEvent):void {
burster.angleOffset += 4;
burster.burst(emitter);
}
private function onEnterFrame(e:Event):void
{
emitter.step();
}
}
}