FF:Message Particle
forked from Message Particle (diff: 25)
ActionScript3 source code
/**
* Copyright bradsedito ( http://wonderfl.net/user/bradsedito )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/rcqW
*/
// forked from rettuce's Message Particle
// forked from nutsu's BitmapDataSample11
package
{
import flash.display.Sprite;
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.events.KeyboardEvent;
import flash.display.BitmapDataChannel;
import flash.filters.BlurFilter;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Matrix;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFieldType;
import flash.text.TextFormat;
import flash.filters.BlurFilter;
import flash.filters.GlowFilter;
[SWF(width = 465, height = 465, backgroundColor = 0x000000, frameRate = 60)]
public class DocumentClass extends Sprite
{
private var bmpdata:BitmapData;
private var vectormap:BitmapData;
private var filter:BlurFilter;
private var particles:Array;
private var particle_number:uint = 120000;
private var size:Number = 465;
private var txt:TextField;
private var tf:TextFormat;
private var tfc:Number;
private var count:uint;
private var blurr:BlurFilter = new BlurFilter( 4,4,2 );
private var gloww:GlowFilter = new GlowFilter( 0xFFFFFF, 1, 2,2, 2);
public function DocumentClass()
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
bmpdata = new BitmapData( size, size, false, 0x000000 );
addChild( new Bitmap( bmpdata ) );
// TextField Data
txt = new TextField();
tf = new TextFormat();
txt.autoSize = TextFieldAutoSize.CENTER;
tf.font = "Arial";
txt.type = TextFieldType.INPUT;
txt.border = true;
txt.borderColor = 0xFF555555;
txt.background = true;
txt.backgroundColor = 0xFF000000;
txt.text = "WHO IS BRAD SEDITO?";
tf.size = 30;
tf.bold = false;
tf.color = 0xFF5555555;
txt.setTextFormat(tf);
txt.x = (465 - txt.width) / 2;
txt.y = 465 / 2 - txt.height / 2;
addChild(txt);
txt.addEventListener(KeyboardEvent.KEY_DOWN, start);
}
private function start(e:KeyboardEvent = null):void
{
if (e.keyCode == 13) // ENTER
{
txt.removeEventListener(KeyboardEvent.KEY_DOWN, start);
removeChild(txt);
vectormap = new BitmapData( size, size, false, 0 );
mapInit();
particleSet();
addEventListener( Event.ENTER_FRAME, enterframe );
}
}
private function fallStart():void
{
removeEventListener( Event.ENTER_FRAME, enterframe );
for (var i:int = 0; i < particle_number; i++)
{
var p:Particle = particles[i];
p.reset();
this.filters = [ blurr, gloww ];
}
tfc = 0xFF000000;
reset();
addEventListener( Event.ENTER_FRAME, enterframe2 );
stage.addEventListener( MouseEvent.CLICK, clickHandler );
}
private function clickHandler(e:Event):void{
tfc = 0xFFFFFFFF;
reset();
}
private function enterframe(e:Event):void
{
//描画を消す
bmpdata.fillRect(bmpdata.rect, 0xFF000000);
//パーティクルの描画
bmpdata.lock();
for (var i:int = 0; i < particle_number; i++ )
{
var p:Particle = particles[i];
//ベクトルマップのPixel値から加速度を算出
var col:uint = vectormap.getPixel(p.x, p.y);
p.ax += ((col >> 16 & 0xff)-128) * 0.0001;
p.ay += ((col >> 8 & 0xff )-128) * 0.0001;
//加速度から速度と位置を算出
p.x += p.vx += p.ax;
p.y += p.vy += p.ay;
if (p.x > size) { p.x -= size; }
else if(p.x < 0) { p.x += size; }
if (p.y > size) { p.y -= size; }
else if(p.y < 0) { p.y += size; }
//Pixelへ描画
bmpdata.setPixel(p.x, p.y, 0xffffff);
//加速度と速度の減衰
p.ax *= 0.96; p.ay *= 0.96;
p.vx *= 0.92; p.vy *= 0.92;
}
bmpdata.unlock();
if (count >= 80) fallStart();
count++;
}
private function enterframe2(e:Event):void
{
bmpdata.fillRect(bmpdata.rect, 0xFF000000);
bmpdata.lock();
for (var i:int = 0; i < particle_number; i++ )
{
var p:Particle = particles[i];
var col:uint = vectormap.getPixel(p.x, p.y);
p.ax += (col >> 16) * 0.0000003;
p.ay += (col >> 8 ) * 0.0000003;
p.x += p.vx += p.ax;
p.y += p.vy += p.ay;
bmpdata.setPixel(p.x, p.y, 0xffffff);
p.ax *= 0.96; p.ay *= 0.96;
p.vx *= 0.92; p.vy *= 0.92;
}
bmpdata.unlock();
}
private function reset(e:MouseEvent = null):void
{
var randomSeed:int = Math.random() * 0xffffffff;
var colors:uint = BitmapDataChannel.RED | BitmapDataChannel.BLUE | BitmapDataChannel.GREEN;
var matrix:Matrix = new Matrix();
// text Field セット
txt.border = txt.background = false;
txt.text = txt.text;
tf.color = tfc;
matrix.translate( 200, 465 / 2 - txt.height / 2);
txt.setTextFormat(tf);
vectormap.perlinNoise( size / 2, size / 2, 4, randomSeed, false, true, colors );
vectormap.draw(txt, matrix);
}
private function mapInit():void {
//ベクトルマップの初期化
vectormap = new BitmapData( size, size, false, 0xFFFFFF );
var randomSeed:int = Math.random() * 0xffffffff;
var colors:uint = BitmapDataChannel.RED | BitmapDataChannel.BLUE | BitmapDataChannel.GREEN;
//マップのセット
vectormap.perlinNoise( size / 2, size / 2, 1, 177, false, true, colors );
}
private function particleSet():void {
particles = new Array(particle_number);
for (var i:int = 0; i < particle_number; i++ ) { particles[i] = new Particle(Math.random() * size, Math.random() * size);}
}
}
}
class Particle {
// 位置
public var x:Number;
public var y:Number;
//加速度
public var ax:Number = 0;
public var ay:Number = 0;
//速度
public var vx:Number = 0;
public var vy:Number = 0;
public function Particle(px:Number,py:Number){
x = px;
y = py;
}
public function reset():void{
ax *= ay *= vx *= vy *= 0;
}
}