ブシャ!
/**
* Copyright clockmaker ( http://wonderfl.net/user/clockmaker )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/NKlY
*/
// forked from soundkitchen's パァン!
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.<Particle>;
private var _inactiveParticles:Vector.<Particle>;
public function Main()
{
graphics.beginFill(0)
graphics.drawRect(0,0,stage.stageWidth, stage.stageHeight)
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.<Particle>();
_inactiveParticles = new Vector.<Particle>();
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 = (Math.random() - 0.5) * 40;
_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<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();
var flash :Sprite = new Sprite()
flash.graphics.beginFill(0xFFFFFF)
flash.graphics.drawRect(0,0,stage.stageWidth, stage.stageHeight)
flash.blendMode = BlendMode.OVERLAY
flash.alpha = 0
addChild(flash)
BetweenAS3.serial(
BetweenAS3.tween(flash, {alpha:0}, {alpha:1},0.3, Sine.easeIn),
BetweenAS3.removeFromParent(flash)
).play()
}
}
}
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;
}