2012年8月31日 星期五

flint particle system:Part3

flint sparkler effect

火花效果
煙火效果
與前一篇雪花效果不同的地方在於,
emitter Counter 這次是一次性的,也就是 Blast
renderer 採用 BitmapRenderer,
並監聽滑鼠事件,當 click 時產生火花。


這裡單純比較 BitmapRenderer 及 DisplayObjectRenderer
兩種 renderer FPS,結果居然是 DisplayObjectRenderer 略勝,
讓我有些意外。

完整 code 如下:
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Point;
import flash.geom.Rectangle;
import net.hires.debug.Stats;
import org.flintparticles.common.actions.Age;
import org.flintparticles.common.actions.Fade;
import org.flintparticles.common.counters.Blast;
import org.flintparticles.common.counters.Steady;
import org.flintparticles.common.displayObjects.Dot;
import org.flintparticles.common.displayObjects.Line;
import org.flintparticles.common.events.EmitterEvent;
import org.flintparticles.common.initializers.ColorInit;
import org.flintparticles.common.initializers.Lifetime;
import org.flintparticles.common.initializers.SharedImage;
import org.flintparticles.twoD.actions.Accelerate;
import org.flintparticles.twoD.actions.LinearDrag;
import org.flintparticles.twoD.actions.Move;
import org.flintparticles.twoD.actions.RotateToDirection;
import org.flintparticles.twoD.activities.FollowMouse;
import org.flintparticles.twoD.emitters.Emitter2D;
import org.flintparticles.twoD.initializers.Velocity;
import org.flintparticles.twoD.renderers.BitmapRenderer;
import org.flintparticles.twoD.zones.DiscZone;
public class Main extends Sprite
{
private var emitter:Emitter2D;
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
// stats
addChild(new Stats);
// emiiter
emitter = new Emitter2D();
// counter,一次性
emitter.counter = new Blast(150);
// particle init, set up the particle’s position, velocity, image, color, lifetime.
// image
var imageClass:SharedImage = new SharedImage(new Line(8));
emitter.addInitializer(imageClass);
// position
// velocity:放射狀
var velocity:Velocity = new Velocity(new DiscZone(new Point(0,0), 100,0));
emitter.addInitializer(velocity);
// color
emitter.addInitializer( new ColorInit( 0xFFFFFF00, 0xFFFF6600 ) );
// life time
emitter.addInitializer( new Lifetime(.4, .8));
// 生命週(秒)
emitter.addAction(new Age);
// 移動
emitter.addAction(new Move);
// 淡出
emitter.addAction(new Fade());
// 加速度
emitter.addAction(new Accelerate(0, 60));
// follow direction.
emitter.addAction(new RotateToDirection());
// slow it down when it's moving.
//emitter.addAction( new LinearDrag( 5 ) );
// render
var renderer:BitmapRenderer = new BitmapRenderer(new Rectangle( 0, 0, 1000, 600 ) );
addChild(renderer);
renderer.addEmitter(emitter);
// follow mouse
//emitter.addActivity(new FollowMouse(renderer));
emitter.x = 500;
emitter.y = 300;
emitter.addEventListener( EmitterEvent.EMITTER_EMPTY, restart, false, 0, true );
//emitter.start();
stage.addEventListener( MouseEvent.CLICK, explode, false, 0, true );
}
private function explode(e:MouseEvent):void
{
emitter.x = mouseX;
emitter.y = mouseY;
emitter.start();
}
private function restart(e:EmitterEvent):void
{
Emitter2D(e.target).stop();
}
}
}

沒有留言:

張貼留言