package common { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Sprite; import flash.filters.BlurFilter; import flash.filters.GlowFilter; import flash.geom.Matrix; import flash.geom.Rectangle; import flash.geom.Vector3D; import flash.utils.Dictionary; import flash.utils.getTimer; import org.cove.ape.Vector; public class MeteorSpawn { private static var blitsRects:Dictionary; private static var bdHalfWidths:Dictionary; private static var objectRadii:Dictionary; private static var blitsVector:Dictionary; public static var MAX_VELOC:Number = 1.5; public static var MIN_VELOC:Number = .1; public var angularSpeedMultiplier:int = 1; public static var possibleRadii:Array = [ 23,15,12,10,8] private static var alreadyCached :Boolean = false; //instance vars public var myX:Number; public var myY:Number; public var myVeloc:Vector3D; public var isAlive:Boolean public var bd:BitmapData; public var bdRadius:Number; public var realRadius:Number; public var myHashString:String; public var frame:int; public static const numFrames:int = 180; public var myBds:Vector.; private var millisecondsPerFrame:int; private var lastTime:int = 0 public var plyForward:Boolean = true; public function cleanUp():void { isAlive = false; myBds = null; myVeloc = null; } public static function preCache():void { if (alreadyCached) return; //initialize static dictionaries blitsRects = new Dictionary(); objectRadii = new Dictionary(); bdHalfWidths = new Dictionary(); blitsVector = new Dictionary(); // Library object to copy var m:Meteor = new Meteor(0, 0); alreadyCached = true; var filterAmount:Number = 33; var currentRotation:Number = 0; for (var i:int = 0 ; i < possibleRadii.length; i++) { var radiiIndex:int = i; var bDHalfWidth:int = possibleRadii[radiiIndex]+filterAmount; var scaledFactor:Number = (possibleRadii[radiiIndex]*2 ) / m.width; var rSprite:Sprite = new Sprite(); blitsRects['' + possibleRadii[i] ] = new Rectangle(0, 0, 2 *bDHalfWidth, 2 *bDHalfWidth ); bdHalfWidths['' + possibleRadii[i] ] = bDHalfWidth; objectRadii['' + possibleRadii[i] ] = possibleRadii[radiiIndex] ; var degrees:Number = 2; var rRadians:Number = Math.PI * degrees / 180; blitsVector['' + possibleRadii[i] ] = new Vector.();; for (var j:int = 0 ; j < numFrames; j++) { var temp:BitmapData; temp = new BitmapData(2 *bDHalfWidth, 2 *bDHalfWidth, true, 0) // 0x000009); blitsVector['' + possibleRadii[i] ].push(temp); var bmp:Bitmap = new Bitmap(m) ; rSprite.addChild(bmp); rSprite.filters = [new GlowFilter(0xFF0000, 1, filterAmount, filterAmount,1)]; //rSprite.filters =[new BlurFilter(filterAmount,filterAmount) ] currentRotation += rRadians; var matr:Matrix = new Matrix(); matr.scale( scaledFactor , scaledFactor ); matr.translate(filterAmount , filterAmount ); matr.translate( -bDHalfWidth, -bDHalfWidth); matr.rotate(currentRotation); matr.translate( bDHalfWidth, bDHalfWidth); temp.draw(rSprite,matr); //blitsDict['' + possibleRadii[i] ] = temp; rSprite.filters = []; rSprite.removeChild(bmp); bmp = null; } rSprite = null; //blitsVector['' + possibleRadii[i] ] = } } public function MeteorSpawn() { } public function update():void { var now:int = getTimer(); if(now - lastTime > millisecondsPerFrame){ frame = (plyForward )? frame + 1: frame -1 ; lastTime = getTimer(); } if(plyForward && frame == numFrames ) frame =0; else if(plyForward == false && frame < 0) frame = numFrames -1; bd = myBds[frame]; myX += myVeloc.x; myY += myVeloc.y; } public function init(x:Number, y:Number, _myVeloc = null,_angularSpeedMultiplier:int = -1 ):void { millisecondsPerFrame = 50 + (Math.random()* 350) millisecondsPerFrame = (millisecondsPerFrame / _angularSpeedMultiplier) > 50 ? millisecondsPerFrame / _angularSpeedMultiplier : 50; myX = x; myY = y; frame = 0; plyForward = Math.random() < .5; isAlive = true; myHashString = '' + possibleRadii[int(Math.random() * possibleRadii.length)]; bd = blitsVector[myHashString][0]; bdRadius = bdHalfWidths[myHashString]; realRadius = objectRadii[myHashString]; myX -= bdRadius; myY -= bdRadius; if (_myVeloc == null) { myVeloc = new Vector3D(); var randomAngle:Number = Math.random() * Math.PI *2; myVeloc.x = Math.cos(randomAngle) *(MAX_VELOC- MIN_VELOC) myVeloc.y = Math.sin(randomAngle) *(MAX_VELOC- MIN_VELOC) } else myVeloc = _myVeloc myBds = blitsVector[myHashString]; bd = myBds[frame]; } } }