今回はforcemapです。
これは色を使ってアニメーションを表現する技法です。
自然的な表現をするときに使います。
ソース
package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.BitmapDataChannel; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.filters.BlurFilter; import flash.geom.ColorTransform; import flash.geom.Rectangle; [SWF(width="500",height="500",backgroundColor="0")] public class particle5 extends Sprite { private var bmpd:BitmapData; private var forcemap:BitmapData; private var bmp:Bitmap; private var colortf:ColorTransform; private var particles:Vector.<Particle>; private var blur:BlurFilter = new BlurFilter(4,4,1); public function particle5() { bmpd = new BitmapData(500,500,false,0); forcemap = new BitmapData(500,500,false,0); bmp = new Bitmap(bmpd); addChild(bmp); //残像 colortf = new ColorTransform(0,.7,.99,.9); onMouseClick(); addEventListener(Event.ENTER_FRAME,onEnterFrame); stage.addEventListener(MouseEvent.CLICK,onMouseClick); } private function onEnterFrame(e:Event):void{ bmpd.colorTransform(new Rectangle(0,0,500,500),colortf); bmpd.applyFilter(bmpd,bmpd.rect,bmpd.rect.topLeft,blur); var len:Number = particles.length; while(len--){ var p:Particle = particles[len]; //色のピクセルを取得 var color:Number = forcemap.getPixel(p.xx,p.yy); //赤 var r:int = color >> 16 & 0xff; //緑 var g:int = color >> 8 & 0xff; p.ax = (r-128)*0.007; p.ay = (g-128)*0.007; p.vx += p.ax; p.vy += p.ay; p.xx += p.vx; p.yy += p.vy; p.ax *= 0.98; p.ay *= 0.98; p.vx *= 0.93; p.vy *= 0.93; //はみ出した時の処理 if(p.xx < 0) p.xx = 500+p.xx; else if(p.xx >= 500) p.xx = p.xx-500; if(p.yy < 0) p.yy = 500+p.yy; else if(p.yy >= 500) p.yy = p.yy-500; bmpd.fillRect(new Rectangle(p.xx,p.yy,1,1),0x00ffff); } } private function onMouseClick(e:MouseEvent = null):void{ particles = new Vector.<Particle>; for(var i:int=0;i<8000;i++){ var p:Particle = new Particle(); p.xx = Math.random()*500; p.yy = Math.random()*500; p.vx = p.vy = p.ax = p.ay = 0; particles.push(p); } forcemap.perlinNoise(500,500,4,Math.floor(Math.random()*0xffffff),false,true,BitmapDataChannel.RED|BitmapDataChannel.GREEN|0|0); } } } class Particle{ public var xx:Number; public var yy:Number; public var vx:Number; public var vy:Number; public var ax:Number; public var ay:Number; }