fluid k__ forked:1favorite:16lines:100license : MIT License modified : 2009-06-01 03:55:00 Embed Tweet package { import flash.display.*; import flash.events.*; import flash.filters.*; import flash.geom.*; public class Main extends Sprite { private var mapHN:uint = 30,mapVN:uint = 30, sh:uint, sw:uint; private var mapW:Number,mapH:Number; private var mX:Number,mY:Number; private var map:Array; private var particles:Array; private var numParticles:uint = 20000; private var canvas:BitmapData; public function Main() { sw = stage.stageWidth; sh = stage.stageHeight; graphics.beginFill(0x002244); graphics.drawRect(0,0,sw,sh); graphics.endFill(); canvas = new BitmapData(sw,sh,true,0x00ffffff); addChild(new Bitmap(canvas)); var i:uint,j:uint; mapW = sw / mapHN; mapH = sw / mapVN; map = []; var m:Object; for (j = 0; j < mapVN; j ++) { map.push([]); for (i = 0; i < mapHN; i ++) { map[j].push(m = new Object); m.vx = m.vy = 0; } } var p:Particle; particles = []; for (i = 0; i < numParticles; i ++) { particles.push(p = new Particle(sw, sh)); } addEventListener(Event.ENTER_FRAME, h_enterFrame); } private function h_enterFrame(evt:Event):void { var i:uint,j:uint,k:int,l:int,cnt:uint,tvx:Number,tvy:Number; var p:Particle,m:Object; for (i = 0; i < numParticles; i ++) { p = particles[i]; m = map[Math.floor(p.x / mapW)][Math.floor(p.y / mapH)]; p.vx = (p.vx +(m.vx - p.vx) / 10) * 0.99; p.vy = (p.vy + (m.vy - p.vy) / 10) * 0.99; p.x += p.vx; p.y+= p.vy; if (p.x < 0 || p.y < 0 || p.x >= sw || p.y >= sw || Math.random() < 0.01) { p.init(); } canvas.setPixel32(p.x, p.y, 0xffffffff); } for (j = 0; j < mapVN; j ++) { for (i = 0; i < mapHN; i ++) { cnt = 30; tvx = map[i][j].vx * cnt; tvy = map[i][j].vy * cnt; for (k = -2; k <=2; k ++) { if (i + k < 0 || i + k >= map.length) { continue } for (l = -2; l <= 2; l ++) { if (j + l < 0 || j + l >= map[i + k].length) { continue } tvx += map[i + k][j + l].vx; tvy += map[i + k][j + l].vy; cnt ++; } } map[i][j].vx = tvx / cnt; map[i][j].vy = tvy / cnt; } } if (mX || mY) { m = map[Math.floor(mX / mapW)][Math.floor(mY / mapH)]; m.vx = (m.vx +(mouseX - mX) * 5) * 0.99; m.vy = (m.vy + (mouseY - mY) * 5) * 0.99; } mX = Math.max(0,Math.min(mouseX, sw - 1)); mY = Math.max(0,Math.min(mouseY, sh - 1)); var filter:BitmapFilter; filter = new ColorMatrixFilter([0.97,0,0,0,0, 0,0.98,0,0,0, 0,0,0.995,0,0, 0,0,0,0.96,0]); canvas.applyFilter(canvas,new Rectangle(0,0,sw,sh),new Point(),filter); /* filter= new BlurFilter(4,4); canvas.applyFilter(canvas,new Rectangle(0,0,sw,sh),new Point(),filter); */ } } } class Particle { public var x:Number,y:Number, vx:Number, vy:Number, sw:uint, sh:uint; function Particle(w:uint, h:uint) { sw = w; sh = h; init(); } public function init() { x = Math.random() * sw; y = Math.random() * sh; vx = vy = 0; } } Code Fullscreen Preview Fullscreen bradsedito kevinlin gomako hacker_fimwf.. FlashFit nki2 Nyarineko fallen web_shiino Hiiragi dizgid enjoy_tpm Koutarou yd_niku Kevin_Yin : particle jjroox747 : interactiveparticle interactive particle map filter Math.floor mouseY mouseX Math.max Math.min Object setPixel32 ColorMatrixFilter drawRect addEventListener endFill applyFilter beginFill Rectangle push addChild length Bitmap sort new page view favorite forked pv4256 swirl (10000 particles) k__ forked:6 favorite:30lines:111 (diff:21) tag: fluid follow particle particle-atmoshper-mouse