模擬音符從空中落下,
當滑鼠觸控到音符,會發出聲響,並產生小火花,
另外,當音符掉落至底部時也會有同樣的效果。
這個效果會用到兩個 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;
程式碼如下:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | |
} | |
} | |
} | |
} |
沒有留言:
張貼留言