// forked from keim_at_Si's Smoky text forked from: adobe challenge 1 package { import flash.display.*; import flash.events.*; import flash.geom.*; import flash.filters.*; public class main extends Sprite { private const FB:Number = 0.98; private var smokeField:Sprite = new Sprite(); private var screen:BitmapData = new BitmapData(465, 465, false, 0); private var feedback:ColorTransform = new ColorTransform(FB, FB, FB, 1); private var blur:BlurFilter = new BlurFilter(4, 4); function main() { SmokyText.forceField.perlinNoise(465, 465, 4, Math.random()*10000, true, true); stage.addEventListener("keyDown", _onKeyDown); addEventListener("enterFrame", _onEnterFrame); addChild(new Bitmap(screen)); smokeField.addChild(new SmokyText(232, 232, 0, "Smoky Text")); } private function _onKeyDown(e:KeyboardEvent) : void { smokeField.addChild(new SmokyText(r(200,232), r(200,232), r(180,-90), String.fromCharCode(e.charCode), 100)); } private function _onEnterFrame(e:Event) : void { screen.colorTransform(screen.rect, feedback); screen.applyFilter(screen, screen.rect, screen.rect.topLeft, blur); screen.draw(smokeField); } private function r(range:Number, offset:Number) : Number { return (Math.random()-Math.random()) * range + offset; } } } import flash.display.*; import flash.text.*; import flash.events.*; import flash.geom.*; import flash.filters.*; class SmokyText extends Shape { static public const FORCE:Number = 0.3; static public const ATTEN:Number = 0.99; static public var forceField:BitmapData = new BitmapData(465, 465, false, 0); static public var blur:BlurFilter = new BlurFilter(1, 2); public var source:BitmapData; public var vel:Vector.<Number> = new Vector.<Number>(); public var vtx:Vector.<Number> = new Vector.<Number>(); public var idx:Vector.<int> = new Vector.<int>(); public var uvt:Vector.<Number> = new Vector.<Number>(); function SmokyText(x:Number, y:Number, rotation:Number, text:String, size:int=70, color:int=0xffffff, face:String='_serif', dv:int=6) { var tf:TextField = new TextField(); tf.autoSize = "left"; tf.htmlText = "<font size='"+String(size)+"' color='#"+color.toString(16)+"' face='"+face+"'>"+text+"</font>"; source = new BitmapData(tf.width+32, tf.height+32, true, 0); source.draw(tf, new Matrix(1,0,0,1,16,16)); var idv:Number=1/dv, u:int, v:int, i:int;//int(tf.width*dv/tf.height+1) vel.length = uvt.length = vtx.length = (dv+1)*(dv+1)*2; idx.length = dv*dv*6; for (i=0, u=0; u<=dv; u++) for (v=0; v<=dv; v++) { vtx[i] = ((uvt[i]=u*idv)-0.5) * source.width; vel[i++] = 0; vtx[i] = ((uvt[i]=v*idv)-0.5) * source.height; vel[i++] = 0;//(v*idv-1)*0.5; } for (i=0, u=0; u<dv; u++) for (v=0; v<dv; v++, i+=6) { idx[i+3]=(idx[i+4]=idx[i+2]=(idx[i+5]=idx[i+1]=(idx[i]=v*(dv+1)+u)+1)+dv)+1; } this.rotation = rotation; this.x = x; this.y = y; alpha = 1; addEventListener("enterFrame", _onEnterFrame); } private function _onEnterFrame(e:Event) : void { source.applyFilter(source, source.rect, source.rect.topLeft, blur); _updateVertex(); graphics.clear(); graphics.beginBitmapFill(source); graphics.drawTriangles(vtx, idx, uvt); graphics.endFill(); alpha *= ATTEN; if (alpha < 0.01) { removeEventListener("enterFrame", _onEnterFrame); parent.removeChild(this); } } private function _updateVertex() : void { var i:int, imax:int = vtx.length; for (i=0; i<imax; i+=2) { var x:Number=vtx[i]+this.x, y:Number=vtx[i+1]+this.y; var c:uint = forceField.getPixel(x, y); vtx[i] = x + (vel[i] += (((c&255) * 0.00390625) - 0.5) * FORCE)*0.2 - this.x; vtx[i+1] = y + (vel[i+1] += ((((c>>8)&255) * 0.00390625) - 0.5) * FORCE)*0.2 - this.y; } } } forked from: Smoky text forked from: adobe challenge 1