2012年8月31日 星期五

flint particle system:Part4

本篇文章算是前兩篇的應用,
模擬音符從空中落下,
當滑鼠觸控到音符,會發出聲響,並產生小火花,
另外,當音符掉落至底部時也會有同樣的效果。


這個效果會用到兩個 emitter,
一個負責處理火花,
另一個負責處理音符,音符還需加上滑鼠互動,
mouseOver 時要產生火花並發出聲響,
加入的方式是用 addInitializer
var mouseHandlers:MouseEventHandlers = new MouseEventHandlers();
mouseHandlers.overHandler = myMouseOver;
emitterNote.addInitializer(mouseHandlers);
這樣產生的 particle 就可監聽 MouseEvent,
粒子 ImageClass 必需是 InteractiveObject
renderer 要用 DisplayObjectRenderer
並記得要開啟 mouseEnabled/mouseChildren
renderer.mouseEnabled = true;
renderer.mouseChildren = true;

程式碼如下:

package
{
import flash.display.Bitmap;
import flash.display.InteractiveObject;
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.events.ParticleEvent;
import org.flintparticles.common.initializers.CollisionRadiusInit;
import org.flintparticles.common.initializers.ColorInit;
import org.flintparticles.common.initializers.ImageClass;
import org.flintparticles.common.initializers.Lifetime;
import org.flintparticles.common.initializers.MouseEventHandlers;
import org.flintparticles.common.initializers.SharedImage;
import org.flintparticles.twoD.actions.Accelerate;
import org.flintparticles.twoD.actions.Collide;
import org.flintparticles.twoD.actions.CollisionZone;
import org.flintparticles.twoD.actions.DeathZone;
import org.flintparticles.twoD.actions.LinearDrag;
import org.flintparticles.twoD.actions.Move;
import org.flintparticles.twoD.actions.RandomDrift;
import org.flintparticles.twoD.actions.RotateToDirection;
import org.flintparticles.twoD.activities.FollowMouse;
import org.flintparticles.twoD.emitters.Emitter2D;
import org.flintparticles.twoD.initializers.Position;
import org.flintparticles.twoD.initializers.Velocity;
import org.flintparticles.twoD.particles.Particle2D;
import org.flintparticles.twoD.renderers.BitmapRenderer;
import org.flintparticles.twoD.renderers.DisplayObjectRenderer;
import org.flintparticles.twoD.zones.DiscZone;
import org.flintparticles.twoD.zones.LineZone;
import org.flintparticles.twoD.zones.PointZone;
import org.flintparticles.twoD.zones.RectangleZone;
public class Main extends Sprite
{
private var emitter:Emitter2D;
private var emitterNote: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);
// 模擬音符從空中落下
emitterNote = new Emitter2D();
emitterNote.counter = new Steady(1);
// 音符,NoteClass must be InteractiveObject
emitterNote.addInitializer(new ImageClass(NoteClass));
emitterNote.addInitializer(new Position(new LineZone(new Point( -5, -5), new Point(1005, -5))));
emitterNote.addInitializer(new Velocity(new PointZone(new Point(0, 60))));
// 加入滑鼠互動
var mouseHandlers:MouseEventHandlers = new MouseEventHandlers();
mouseHandlers.overHandler = myMouseOver;
emitterNote.addInitializer(mouseHandlers);
emitterNote.addAction(new DeathZone( new RectangleZone( -10, -10, 1020, 580 ), true ) );
emitterNote.addAction(new Move);
// 火花 emiiter
emitter = new Emitter2D();
emitter.counter = new Blast(50);
// particle init, set up the particle’s position, velocity, image, color, lifetime.
// image
emitter.addInitializer(new ImageClass(Line,[8]));
// 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);
// render 一定要用 DisplayObjectRenderer
var renderer:DisplayObjectRenderer = new DisplayObjectRenderer();
addChild(renderer);
renderer.addEmitter(emitter);
renderer.addEmitter(emitterNote);
// support mouse interactive
renderer.mouseEnabled = true;
renderer.mouseChildren = true;
// follow mouse
// emitter event
//emitter.addActivity(new FollowMouse(renderer));
emitter.x = 500;
emitter.y = 300;
emitter.addEventListener(EmitterEvent.EMITTER_EMPTY, restart, false, 0, true);
// particle event
emitterNote.addEventListener(ParticleEvent.PARTICLE_DEAD, dead, false, 0, true);
emitterNote.start();
}
private function explode(e:MouseEvent=null):void
{
emitter.x = mouseX;
emitter.y = mouseY;
emitter.start();
}
private function restart(e:EmitterEvent):void
{
Emitter2D(e.target).stop();
}
private function myMouseOver(e:MouseEvent):void
{
e.target.visible = false;
explode();
}
private function dead(e:ParticleEvent):void
{
trace("particle dead:",Particle2D(e.particle).image.visible);
if (Particle2D(e.particle).image.visible) {
emitter.x = Particle2D(e.particle).x;
emitter.y = Particle2D(e.particle).y;
emitter.start();
}
}
}
}

沒有留言:

張貼留言