/* By Razorberry (http://www.razorberry.com/blog/) */ /* Compiler options: -default-size=300,300 -default-background-color=0x000000 -optimize=true -default-frame-rate=31 */ package { import flash.display.*; import flash.geom.Rectangle; import flash.filters.* import flash.geom.Point; import flash.geom.Matrix; import flash.events.Event; import flash.util.trace; import flash.text.*; public class OldSchoolFX extends MovieClip { internal static const DOTS:int = 50; internal static const FLASHY_TEXT:String = "FLASH"; internal var holder:Bitmap; internal var displacementBitmap:BitmapData; internal var dFilter:DisplacementMapFilter; internal var sourceRect:Rectangle; internal var origin:Point; internal var textBitmap:BitmapData; internal var textRect:Rectangle; internal var textLocation:Point; internal var cycle:int = 0; public function OldSchoolFX() { // Create the bitmap for display var mybmp:BitmapData = new BitmapData(300,300,true,0x00000000); holder = new Bitmap(mybmp); // Attach the bitmap to the stage this.addChild(holder); // Set up some points and rectangles to use later. origin = new Point(0,0); sourceRect = new Rectangle(0,0,300,300); // Create a bitmap to use in a displacement filter displacementBitmap = new BitmapData(300,300,false,0xFFFFFF); // Create a clip to make some temporary gradients in var dClip:Sprite = new Sprite(); // The goal is to make a set of two gradients // to spread pixels out from the centre of the image // We'll use one for X and one for Y // Horizontal red gradient for horizontal displacement var m:Matrix = new Matrix(); // The third argument here (0.2) tilts the displacement filter a little // This makes a slight rotating effect.. m.createGradientBox(300,300,0.2,0,0); dClip.graphics.beginGradientFill(GradientType.LINEAR, [0xFF0000,0x0], [100,100], [0,255], m, null, InterpolationMethod.RGB); dClip.graphics.drawRect(0,0,300,300); // Draw this gradient into a bitmap. var redbmp:BitmapData = new BitmapData(300,300,false,0); redbmp.draw(dClip); // Uncomment the next line if the gradient angle above is not zero // It nudges pixels on the center line to the right a bit. //redbmp.fillRect(new Rectangle(149,0,2,300), 0x7E0000); // Copy the red channel into our displacement bitmap. displacementBitmap.copyChannel(redbmp, sourceRect, origin, BitmapDataChannel.RED, BitmapDataChannel.RED); // Make a blue vertical gradient for the Y component. var n:Matrix = new Matrix(); n.createGradientBox(300,300,Math.PI/2+0.2,0,0); dClip.graphics.beginGradientFill(GradientType.LINEAR, [0x0000FF,0x0], [100,100], [0,255], n, null, InterpolationMethod.RGB); dClip.graphics.drawRect(0,0,300,300); redbmp.draw(dClip); // Uncomment the next line if the angle above is not Math.PI/2 // It nudges the pixels off the center line. //redbmp.fillRect(new Rectangle(0,149,300,1), 0x00007E); // Copy the blue channel into our displacement bitmap. displacementBitmap.copyChannel(redbmp, sourceRect, origin, BitmapDataChannel.BLUE, BitmapDataChannel.BLUE); // Get rid of the temporary bitmap. redbmp.dispose(); // Create the filter dFilter = new DisplacementMapFilter(displacementBitmap, origin, BitmapDataChannel.RED, BitmapDataChannel.BLUE, 10, 10, DisplacementMapFilterMode.CLAMP); // Create a bitmap for some flashing text and draw the text into it. var tf:TextField = new TextField(); var tfm:TextFormat = new TextFormat("Arial",14,0xFFFFFFFF); tfm.bold = true; tfm.align = TextFormatAlign.CENTER; tf.background = false; tf.autoSize = TextFieldAutoSize.LEFT; tf.text = FLASHY_TEXT; tf.setTextFormat(tfm); textBitmap = new BitmapData(tf.width, tf.height,true,0x00000000); textBitmap.draw(tf, null, null, null, null, true); // Save these for later textRect = new Rectangle(0,0,tf.width,tf.height); textLocation = new Point(150 - tf.width/2, 150 - tf.height/2); // Set the onEnterFrame handler.. holder.addEventListener(Event.ENTER_FRAME, onHolderEnterFrame); } internal function onHolderEnterFrame(e:Event):void { cycle++; // This could be optimized maybe.. holder.bitmapData.applyFilter(holder.bitmapData, sourceRect, origin, dFilter); for (var i:int = 0; i < DOTS; i++) { // Draw 4 sets of dots.. // Tweak the numbers here to see the effects! var xscale:Number = Math.sin(Number(cycle+i) / 20 + Number(cycle)/50)*15; var yscale:Number = Math.sin(Number(cycle+i) / 17 + Number(cycle)/50)*15; var cookiePoint:Point = new Point( xscale * 9 + 150, yscale * 10 + 150); var dotRect:Rectangle = new Rectangle(cookiePoint.x, cookiePoint.y,3,3); holder.bitmapData.fillRect(dotRect, 0xFFFF55FF); var xscale:Number = Math.cos(Number(cycle+i) / 15 + Number(cycle)/50)*15; var yscale:Number = Math.cos(Number(cycle+i) / 22 + Number(cycle)/50)*15; var cookiePoint:Point = new Point( xscale * 9 + 150, yscale * 10 + 150); var dotRect:Rectangle = new Rectangle(cookiePoint.x, cookiePoint.y,3,3); holder.bitmapData.fillRect(dotRect, 0xFFFF5555); var xscale:Number = Math.sin(Number(cycle+i) / 20 + Number(cycle)/50)*15; var yscale:Number = Math.cos(Number(cycle+i) / 14 + Number(cycle)/50)*15; var cookiePoint:Point = new Point( xscale * 9 + 150, yscale * 10 + 150); var dotRect:Rectangle = new Rectangle(cookiePoint.x, cookiePoint.y,3,3); holder.bitmapData.fillRect(dotRect, 0xFFAA55FF); var xscale:Number = Math.cos(Number(cycle+i) / 25 + Number(cycle)/50)*15; var yscale:Number = Math.sin(Number(cycle+i) / 21 + Number(cycle)/50)*15; var cookiePoint:Point = new Point( xscale * 9 + 150, yscale * 10 + 150); var dotRect:Rectangle = new Rectangle(cookiePoint.x, cookiePoint.y,3,3); holder.bitmapData.fillRect(dotRect, 0xFFFF55AA); } // Paste some text in the middle every once in a while.. if (cycle % 40 == 0) { holder.bitmapData.copyPixels(textBitmap, textRect, textLocation, null, null, true); } } } }