package { import flash.display.BlendMode; import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Sprite; import flash.events.Event; import flash.events.TimerEvent; import flash.text.TextField; import flash.text.TextFieldAutoSize; import flash.text.TextFormat; import flash.filters.BitmapFilterQuality; import flash.filters.BlurFilter; import flash.geom.Point; import flash.utils.Timer; import com.flashdynamix.utils.SWFProfiler; import frocessing.color.ColorHSV; import org.libspark.betweenas3.BetweenAS3; import org.libspark.betweenas3.easing.*; import org.libspark.betweenas3.tweens.ITween; [SWF(width=465, height=465, frameRate=60, backgroundColor=0x000000)] public class Main extends Sprite { private static var P_ZERO:Point = new Point(); private static var F_BLUR:BlurFilter = new BlurFilter(4, 4, BitmapFilterQuality.LOW); private var _txt:TextField; private var _hsv:ColorHSV; private var _film:BitmapData; private var _timer:Timer; private var _activeParticles:Vector.; private var _inactiveParticles:Vector.; public function Main() { addEventListener(Event.ADDED_TO_STAGE, initialize); } private function initialize(evt:Event):void { removeEventListener(Event.ADDED_TO_STAGE, initialize); SWFProfiler.init(this); var i:uint, fmt:TextFormat, bm:Bitmap; _activeParticles = new Vector.(); _inactiveParticles = new Vector.(); for (i=0; i<10000; i++) { _inactiveParticles.push(new Particle()); } _hsv = new ColorHSV(0, 1, 1, 1); fmt = new TextFormat(); fmt.font = "Verdana"; fmt.bold = true; fmt.size = 36; _txt = new TextField(); _txt.defaultTextFormat = fmt; _txt.autoSize = TextFieldAutoSize.LEFT; _txt.text = "パァン!"; _film = new BitmapData(stage.stageWidth, stage.stageHeight, true, 0); bm = new Bitmap(_film); //bm.blendMode = BlendMode.ADD; addChild(bm); _timer = new Timer(0); _timer.addEventListener(TimerEvent.TIMER, timerHandler); _timer.start(); addEventListener(Event.ENTER_FRAME, enterFrameHandler); } private function enterFrameHandler(evt:Event):void { var i:uint, p:Particle; _hsv.h = ++_hsv.h % 360; _film.lock(); _film.applyFilter(_film, _film.rect, P_ZERO, F_BLUR); for (i=0; i<_activeParticles.length; i++) { p = _activeParticles[i]; p.x += p.vx; p.y += p.vy; p.life--; _film.setPixel32(p.x, p.y, p.color); if (!p.life) { _activeParticles.splice(i, 1); _inactiveParticles.push(p); i--; } } _film.unlock(); } private function timerHandler(evt:TimerEvent):void { _timer.delay = (50 + Math.random() * 950) >> 0; var sp:Sprite, bm:Bitmap, bmd:BitmapData, t:ITween; //_hsv.h = ++_hsv.h % 360; _txt.textColor = _hsv.value; bmd = new BitmapData(_txt.width, _txt.height, true, 0); bmd.draw(_txt); bm = new Bitmap(bmd); bm.smoothing = true; bm.x -= bm.width >> 1; bm.y -= bm.height >> 1; sp = new Sprite(); sp.addChild(bm); sp.x = (Math.random() * stage.stageWidth) >> 0; sp.y = (Math.random() * stage.stageHeight) >> 0; sp.scaleX = 0; sp.scaleY = 0; sp.rotation = (Math.random() * 360) >> 0; //sp.blendMode = BlendMode.ADD; addChild(sp); t = BetweenAS3.serial( BetweenAS3.to(sp, { 'scaleX': 1, 'scaleY': 1, 'rotation': 0 }, 2, Expo.easeIn), BetweenAS3.removeFromParent(sp) ); t.onComplete = tweenComplete; t.onCompleteParams = [sp, bm, bmd]; t.play(); } private function tweenComplete(sp:Sprite, bm:Bitmap, bmd:BitmapData):void { var i:uint, j:uint, c:uint, cx:Number, cy:Number, angle:Number, strength:Number, p:Particle; cx = sp.x + bm.x; cy = sp.y + bm.y; for (i=0; i