package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Sprite; import flash.events.Event; import flash.geom.Matrix; import flash.text.TextField; /** * @author mykhel * http://mtrinitaria.com/mykhel/ * http://mptgame.com */ public class Main extends Sprite { private var tf:TextField = new TextField(); private var bmpData:BitmapData; private var txtHolder:Sprite = new Sprite(); private var pixels:Array = new Array(); private var newBmpData:BitmapData; private var newBmp:Bitmap; private var midX:Number; private var midY:Number; public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); // entry point stage.scaleMode = "noScale"; stage.align = "tl"; tf.htmlText = "
I'm not a math genius. \nIt is just lucky shot."; tf.autoSize = "left"; txtHolder.addChild(tf); midX = stage.stageWidth / 2 - tf.width / 2; midY = stage.stageHeight / 2 - tf.height / 2; bmpData = new BitmapData(800, 800, true, 0); bmpData.draw(txtHolder); for (var i:int = 0; i < txtHolder.height; i++) { for (var j:int = 0; j < txtHolder.width; j++) { pixels.push( { color:bmpData.getPixel32(j, i), x:j, y:i, tx:j, ty:i, vx:Math.random() * stage.stageWidth / 2 - stage.stageWidth / 4, vy:Math.random() * stage.stageHeight / 2 - stage.stageHeight / 4 } ); } } newBmpData = new BitmapData(stage.stageWidth, stage.stageHeight, true, 0); newBmp = new Bitmap(newBmpData, "always", true); addChild(newBmp); addEventListener(Event.ENTER_FRAME, onenterframe); txtHolder = null; } private var prevPixels:Array = new Array(); private function onenterframe(e:Event):void { var d:Date = new Date(); var t:Number = d.getTime(); for (i = 0; i < prevPixels.length; i++) { newBmpData.setPixel32(prevPixels[i].x + midX, prevPixels[i].y + midY, 0); } prevPixels = null; prevPixels = new Array(); for (var i:int = 0; i < pixels.length; i++) { var tmpX:Number = pixels[i].x - mouseX + midX; var tmpY:Number = pixels[i].y - mouseY + midY; var dist:Number = tmpX * tmpX + tmpY * tmpY; if (dist < tf.width * tf.height) { var ang:Number = Math.atan2(tmpY, tmpX); pixels[i].vx += Math.cos(ang) * (tf.width * tf.height - dist) * .0009; pixels[i].vy += Math.sin(ang) * (tf.width * tf.height - dist) * .0009; } pixels[i].vx += (pixels[i].tx - pixels[i].x) * .09; pixels[i].vy += (pixels[i].ty - pixels[i].y) * .09; pixels[i].vx *= .89; pixels[i].vy *= .89; pixels[i].x = Math.round(pixels[i].x + pixels[i].vx); pixels[i].y = Math.round(pixels[i].y + pixels[i].vy); newBmpData.setPixel32(pixels[i].x + midX, pixels[i].y + midY, pixels[i].color); prevPixels.push({ x:pixels[i].x , y:pixels[i].y }) } // will trace the frames per seconds. the bigger the textfield, the slower higher FPSs will be. trace((new Date().getTime()) - t); } } }