forked from: パァン!
/**
* Copyright yd_niku ( http://wonderfl.net/user/yd_niku )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/dYNf
*/
// forked from soundkitchen's パァン!
package
{
import flash.display.*;
import flash.events.*;
import flash.filters.*;
import flash.geom.*;
import flash.utils.*;
import flash.text.*;
import flash.net.*;
import flash.system.*;
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.<Particle>;
private var _inactiveParticles:Vector.<Particle>;
public static const IMAGE_URL:String = "http://a3.twimg.com/profile_images/770090945/icon.jpg";
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 loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,ready);
loader.load( new URLRequest(IMAGE_URL), new LoaderContext(true) )
}
private var orgBitmapData:BitmapData;
private function ready(e:Event):void{
var content:BitmapData= Bitmap(LoaderInfo( e.currentTarget ).content).bitmapData as BitmapData;
orgBitmapData = new BitmapData( 32, 32 );
var mat:Matrix = new Matrix();
mat.scale( 32/content.width, 32/content.height );
orgBitmapData.draw( content, mat );
var i:uint,
fmt:TextFormat,
bm:Bitmap;
_activeParticles = new Vector.<Particle>();
_inactiveParticles = new Vector.<Particle>();
for (i=0; i<10000; i++)
{
_inactiveParticles.push(new Particle());
}
_hsv = new ColorHSV(0, 1, 1, 1);
_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(orgBitmapData.width, orgBitmapData.height, true, 0);
bmd.draw(orgBitmapData);
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<bmd.width; i++)
{
for (j=0; j<bmd.height; j++)
{
c = bmd.getPixel32(i, j);
if (!c) continue;
p = _inactiveParticles.length ? _inactiveParticles.shift() : new Particle();
angle = Math.random() * Math.PI * 2;
strength = Math.random() * 20;
p.vx = Math.cos(angle) * strength;
p.vy = Math.sin(angle) * strength;
p.x = cx + i;
p.y = cy + j;
p.color = c;
p.life = 200;
_activeParticles.push(p);
}
}
bmd.dispose();
}
}
}
class Particle
{
public var vx:Number;
public var vy:Number;
public var x:Number;
public var y:Number;
public var color:uint;
public var life:uint;
}