before X'mas soundkitchen.. forked:0favorite:3lines:127license : MIT License modified : 2009-10-09 03:18:31 Embed Tweet package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.BlendMode; import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageQuality; import flash.display.StageScaleMode; import flash.events.Event; import flash.events.MouseEvent; import flash.filters.BitmapFilter; import flash.filters.BitmapFilterQuality; import flash.filters.BlurFilter; import flash.geom.ColorTransform; import flash.geom.Matrix; import flash.geom.Point; import frocessing.color.ColorHSV; import com.flashdynamix.utils.SWFProfiler; [SWF(width=465, height=465, frameRate=60, backgroundColor=0x000000)] /** * */ public class Main extends Sprite { private var _isMouseDown:Boolean = false; private var _film0:BitmapData; private var _film1:BitmapData; private var _ctf:ColorTransform; private var _mtx:Matrix; private var _hsv:ColorHSV; private var _filter:BitmapFilter; private var _zeros:Point; private var _particles:Vector.<Particle>; /** * */ public function Main() { addEventListener(Event.ADDED_TO_STAGE, initialize); } /** * */ private function initialize(evt:Event):void { removeEventListener(Event.ADDED_TO_STAGE, initialize); // setup stage. stage.align = StageAlign.TOP_LEFT; stage.quality = StageQuality.HIGH; stage.scaleMode = StageScaleMode.NO_SCALE; // setup debugger. SWFProfiler.init(this); var bm:Bitmap; _film0 = new BitmapData(stage.stageWidth, stage.stageHeight, true, 0); bm = new Bitmap(_film0); bm.smoothing = true; addChild(bm); _film1 = new BitmapData(stage.stageWidth >> 2, stage.stageHeight >> 2, true, 0); bm = new Bitmap(_film1); bm.transform.matrix = new Matrix(4, 0, 0, 4); bm.smoothing = true; bm.blendMode = BlendMode.ADD; addChild(bm); _mtx = new Matrix(1/4, 0, 0, 1/4); _ctf = new ColorTransform(.75, .75, .75, 1); _hsv = new ColorHSV(0, 1, 1, 1); _filter = new BlurFilter(16, 16, BitmapFilterQuality.LOW); _zeros = new Point(); _particles = new Vector.<Particle>(); stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler); } private function enterFrameHandler(evt:Event):void { var i:uint, l:uint, p:Particle; _hsv.h = ++_hsv.h % 360; if (_isMouseDown) { var strength:Number, angle:Number; strength = Math.random() * 20; angle = Math.random() * Math.PI * 2; for (i=0; i<30; i++) { p = new Particle(); p.life = 200; p.c = 0xFF000000|_hsv.value; p.x = mouseX; p.y = mouseY; p.vx = Math.cos(angle) * strength; p.vy = Math.sin(angle) * strength; _particles.push(p); } } _film0.lock(); _film0.applyFilter(_film0, _film0.rect, _zeros, _filter); l = _particles.length; for (i=0; i<l; i++) { p = _particles[i]; p.vy += 9.8 / stage.frameRate; p.x += p.vx * p.life / 1200; p.y += p.vy * p.life / 1200; p.life--; _film0.setPixel32(p.x, p.y, p.c); if (!p.life) { _particles.splice(i, 1); i--; l--; } } //_film0.colorTransform(_film0.rect, _ctf); _film0.unlock(); _film1.lock(); _film1.colorTransform(_film1.rect, _ctf); _film1.draw(_film0, _mtx); _film1.unlock(); } private function mouseDownHandler(evt:MouseEvent):void { _isMouseDown = true; } private function mouseUpHandler(evt:MouseEvent):void { _isMouseDown = false; } } } internal class Particle { public var life:uint; public var c:uint; public var x:Number, y:Number; public var vx:Number, vy:Number; } Code Fullscreen Preview Fullscreen Murai nki2 halfmile : 鞭炮效果 particle ColorHSV MouseEvent.ADDED_TO_STAGE quality value MouseEvent StageScaleMode.NO_SCALE splice MouseEvent.MOUSE_UP MouseEvent.MOUSE_DOWN MouseEvent.ENTER_FRAME push BlurFilter Math.cos Point Boolean Math.PI length Math.sin Vector Math.random