package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Sprite; import flash.events.Event; import flash.filters.DropShadowFilter; import flash.filters.BlurFilter; import flash.filters.ColorMatrixFilter; import flash.filters.GradientBevelFilter; import flash.geom.Matrix; import flash.geom.Point; import flash.geom.Rectangle; /** * ... * @author Niklas Knaack * @link http://niklasknaack.blogspot.com */ public final class Clouds extends Sprite { //------------------------------------------------------------------------------------------------------------- /* const */ protected const MASK_DIF:int = 30; //------------------------------------------------------------------------------------------------------------- /* vars */ private var w:int; private var h:int; private var w2:int; private var h2:int; private var scaleFactor:int; private var strength:Number; private var periodX:Number; private var periodY:Number; private var numOctaves:int; private var rColor:uint; private var gColor:uint; private var bColor:uint; private var aColor:uint; private var seed:int; private var offsets:Array; private var mouseControl:Boolean; private var mouseSens:Number; private var bitmapDataDisplay:BitmapData; private var bitmapDisplay:Bitmap; private var bitmapDataPerlinNoise:BitmapData; private var colorMatrixFilter:ColorMatrixFilter; private var point:Point; private var rectangle:Rectangle; private var matrix:Matrix; private var sectionMask:Sprite; private var sectionMaskW:int private var sectionMaskH:int //------------------------------------------------------------------------------------------------------------- /* Clouds */ public function Clouds( w:int, h:int ):void { this.w = w + MASK_DIF; this.h = h + MASK_DIF; this.w2 = w / 2; this.h2 = h / 2; this.sectionMaskW = w; this.sectionMaskH = h; //--- this.init(); } //------------------------------------------------------------------------------------------------------------- /* init */ private function init():void { this.sectionMask = new Sprite(); this.sectionMask.graphics.beginFill( 0x000000, 1 ); this.sectionMask.graphics.drawRect( 0, 0, this.sectionMaskW, this.sectionMaskH ); this.addChild( this.sectionMask ); this.mask = this.sectionMask; //--- this.scaleFactor = 8; this.strength = 1.2; this.periodX = 70; this.periodY = 70; this.numOctaves = 10; this.rColor = 255; this.gColor = 255; this.bColor = 222; this.aColor = 0; this.mouseControl = false; this.mouseSens = 0.01; //--- this.setOffets( this.numOctaves ); //--- this.bitmapDataPerlinNoise = new BitmapData( this.w / this.scaleFactor, this.h / this.scaleFactor, true ); this.bitmapDataDisplay = new BitmapData( this.w, this.h, true ); this.bitmapDisplay = new Bitmap( this.bitmapDataDisplay, "auto", false ); this.setColorMatrixFilter(); this.seed = int( Math.random() * 10000 ); //--- this.matrix = new Matrix(); this.matrix.createBox( this.scaleFactor, this.scaleFactor, 0, 0, 0 ); this.point = new Point(); this.rectangle = this.bitmapDataDisplay.rect; //--- this.addEventListener( Event.ENTER_FRAME, this.enterFrameHandler, false, 0, true ); } //------------------------------------------------------------------------------------------------------------- /* enterFrameHandler */ private function enterFrameHandler( e:Event ):void { var i:int = this.numOctaves; while ( i-- ) { if ( this.mouseControl ) { this.offsets[ i ].x += ( this.mouseX - this.w2 ) * this.mouseSens * ( ( i + 1 ) / this.numOctaves ); this.offsets[ i ].y += ( this.mouseY - this.h2 ) * this.mouseSens * ( ( i + 1 ) / this.numOctaves ); } else { this.offsets[ i ].x -= .15; this.offsets[ i ].y -= .02; } } this.bitmapDataPerlinNoise.perlinNoise( this.periodX, this.periodY, this.numOctaves, this.seed, false, true, 1, true, this.offsets ); //--- this.bitmapDataDisplay.draw( this.bitmapDataPerlinNoise, this.matrix, null, null, null, true ); this.bitmapDataDisplay.applyFilter( this.bitmapDataDisplay, this.rectangle, this.point, this.colorMatrixFilter ); //--- this.graphics.clear(); this.graphics.beginBitmapFill( this.bitmapDataDisplay, null, false, true ); this.graphics.drawRect( 0, 0, this.sectionMaskW, this.sectionMaskH ); } //------------------------------------------------------------------------------------------------------------- /* setScaleFactor */ public function setScaleFactor( scaleFactor:int = 1.2 ):void { this.scaleFactor = scaleFactor; //--- this.bitmapDataPerlinNoise = new BitmapData( this.w / this.scaleFactor, this.h / this.scaleFactor, true ); this.matrix = new Matrix(); this.matrix.createBox( this.scaleFactor, this.scaleFactor, 0, 0, 0 ); } /* setStrength */ public function setStrength( strength:Number = 1 ):void { this.strength = strength; this.setColorMatrixFilter(); } /* setMouseControl */ public function setMouseControl( enable:Boolean = true ):void { this.mouseControl = enable; } /* setNumOctaves */ public function setNumOctaves( numOctaves:int = 10 ):void { this.setOffets( numOctaves ); } /* setPeriodX */ public function setPeriodX( periodX:int = 60 ):void { this.periodX = periodX; } /* setPeriodY */ public function setPeriodY( periodY:int = 60 ):void { this.periodY = periodY; } /* setMouseSens */ public function setMouseSens( mouseSens:Number = 0.1 ):void { this.mouseSens = mouseSens / 10; } /* setRGB_R */ public function setRGB_R( r:uint = 255 ):void { this.rColor = r; this.setColorMatrixFilter(); } /* setRGB_G */ public function setRGB_G( g:uint = 255 ):void { this.gColor = g; this.setColorMatrixFilter(); } /* setRGB_B */ public function setRGB_B( b:uint = 255 ):void { this.bColor = b; this.setColorMatrixFilter(); } /* setRGB_A */ public function setRGB_A( a:uint = 255 ):void { this.aColor = a; this.setColorMatrixFilter(); } //------------------------------------------------------------------------------------------------------------- /* setColorMatrixFilter */ private function setColorMatrixFilter():void { this.colorMatrixFilter = new ColorMatrixFilter( [ 0, 0, 0, 0, this.rColor,// red 0, 0, 0, 0, this.gColor,// green 0, 0, 0, 0, this.bColor,// blue this.strength, 0, 0, 0, this.aColor ] );// alpha } /* setOffets */ private function setOffets( numOctaves:int ):void { this.offsets = new Array(); var i:int = numOctaves; while ( i-- ) this.offsets.push( new Point() ); this.numOctaves = numOctaves; } //------------------------------------------------------------------------------------------------------------- /* die */ public function die():void { this.removeEventListener( Event.ENTER_FRAME, this.enterFrameHandler ); //--- this.colorMatrixFilter = null; this.matrix = null; //--- this.bitmapDisplay = null; this.bitmapDataPerlinNoise.dispose(); this.bitmapDataPerlinNoise = null; this.bitmapDataDisplay.dispose(); this.bitmapDataDisplay = null; } //------------------------------------------------------------------------------------------------------------- } }