particleを使った文字生成

覚え書きです。

package
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.events.TimerEvent;
	import flash.filters.BlurFilter;
	import flash.geom.ColorTransform;
	import flash.geom.Matrix;
	import flash.geom.Point;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	import flash.text.TextFormat;
	import flash.utils.Timer;
	
	[SWF(width="500",height="500",backgroundColor="0")]
	public class particle_mozi extends Sprite
	{
		private var bmpd:BitmapData; //text
		private var bmp:Bitmap;
		private var canvas:BitmapData;  //particle
		private var tf:TextField = new TextField();
		private var particles:Vector.<particle> = new Vector.<particle>;
		private var colortf:ColorTransform;
		private var blur:BlurFilter = new BlurFilter(4,4,1);
		private var cnt:Number = 0;
		
		public function particle_mozi()
		{
			canvas = new BitmapData(500,500,false,0);
			bmpd = new BitmapData(500,500,false, 0);
			
			tf.defaultTextFormat = new TextFormat(null,80);
			tf.autoSize = TextFieldAutoSize.LEFT;
			
			
			colortf = new ColorTransform(0,0.9,0.98,0);
			addChild(new Bitmap(canvas));
			//			addChild(new Bitmap(bmpd));
			
			onMouseEvent();
			
			addEventListener(Event.ENTER_FRAME,onEnterFrame);
			stage.addEventListener(MouseEvent.CLICK,onMouseEvent);
		}
		
		private function onMouseEvent(e:MouseEvent = null):void{
			particles.splice(0,particles.length);
			if(cnt % 3 == 0){
				tf.textColor = 0x00ffff;
				tf.text = "Hello World!";
			}
			if(cnt % 3 == 1){
				tf.textColor = 0x0000ff;
				tf.text = "ahahahahaha";
			}
			if(cnt % 3 == 2){
				tf.textColor = 0x00ff00;
				tf.text = "ふにゃふにゃ";
			}
			bmpd.draw(tf,new Matrix(1,0,0,1,(500-tf.width)/2,(500-tf.height)/2)); 
			
			for(var i:int=0;i < bmpd.width;i++){
				for(var j:int=0;j < bmpd.height;j++){
					var c:uint = bmpd.getPixel(i,j);
					if(c != 0){
						makeParticle(i,j,c);
					}
				}
			}
			cnt++;
		}
		
		private function onEnterFrame(e:Event = null):void{
			bmpd.fillRect(bmpd.rect,0); 
			
			var n:int = particles.length;
			canvas.fillRect(canvas.rect,0);
			canvas.applyFilter(canvas,canvas.rect,canvas.rect.topLeft,blur);
			canvas.colorTransform(canvas.rect,colortf);
			canvas.lock();
			for(var i:int=0;i<particles.length;i++){
				var p:particle = particles[i];
				if(Math.abs(p.ex - p.xx) < 0.5 && Math.abs(p.ey - p.yy) < 0.5){
					p.xx = p.ex;
					p.yy = p.ey;
				}
				else{
					p.xx += (p.ex - p.xx) / 6;
					p.yy += (p.ey - p.yy) / 6;
				}
				canvas.setPixel(p.xx,p.yy,p.color); 
			}
			canvas.unlock();
		}
		
		private function makeParticle(xx:Number,yy:Number,color:Number):void{
			var p:particle = new particle(xx,yy,color);
			var rad:Number = Math.random() * Math.PI * 2;
			var dis:Number = Math.random() * 800;
			p.xx = p.ex + dis * Math.cos(rad);
			p.yy = p.ey + dis * Math.sin(rad);
			particles.push(p);
		}
	}
}

class particle{
	public var xx:Number;
	public var yy:Number;
	public var ex:Number;
	public var ey:Number;
	public var color:uint;
	public function particle(x:Number,y:Number,c:uint){
		this.xx = 0;
		this.yy = 0;
		this.ex = x;
		this.ey = y;
		this.color = c;
	}
}

結果
http://about-hiroppy.com/blog/20130321/