package common { import de.polygonal.core.ObjectPool; import flash.display.BitmapData; import flash.geom.Point import flash.geom.Rectangle; import flash.geom.Vector3D; /** * ... * @author Vernon */ public class MeteorSpawnFactory { private var spawnPool:ObjectPool; public var spawns:Vector.; public var canvas:BitmapData private var point:Point; private static var _instance:MeteorSpawnFactory; public var killAtBounds:Boolean=false; public var boundingRectangle:Rectangle; public function cleanUp():void { canvas = null; var i:int; for (i = spawns.length-1; i >= 0 ; i--) { var t:MeteorSpawn = spawns[i]; t.cleanUp(); t = null; } spawns = null; spawnPool.initialze('cleanUp',null); spawnPool.deconstruct(); spawnPool = null; boundingRectangle = null; } public static function getInstance():MeteorSpawnFactory { if (_instance == null) { _instance = new MeteorSpawnFactory(); _instance.spawnPool = new ObjectPool(true); _instance.spawnPool.allocate(MeteorSpawn, 100); _instance.spawns = new Vector.(); _instance.point = new Point() ; _instance.boundingRectangle = new Rectangle(0,0,450,450); MeteorSpawn.preCache(); } return _instance; } public function step():void { var len:int = spawns.length; for (var i:int = len -1; i >= 0 ; i --) { var mS:MeteorSpawn; mS = spawns[i]; point.x = mS.myX; point.y = mS.myY; if (mS.myX > boundingRectangle.width){ mS.myX = boundingRectangle.x - mS.bdRadius; if (killAtBounds) mS.isAlive = false; } else if (mS.myX < -mS.bdRadius){ mS.myX = boundingRectangle.width - mS.bdRadius; if (killAtBounds) mS.isAlive = false; } if (mS.myY > boundingRectangle.height){ mS.myY = boundingRectangle.y- mS.bdRadius; if (killAtBounds) mS.isAlive = false; } else if (mS.myY < -mS.bdRadius){ mS.myY = boundingRectangle.height -mS.bdRadius; if (killAtBounds) mS.isAlive = false; } if (mS.isAlive == false) { spawnPool.object = spawns.splice(i, 1)[0] ; } else{ mS.update(); canvas.copyPixels(mS.bd, mS.bd.rect, point); } } } public function addSpawn(x:Number, y:Number,velocityVec:Vector3D=null, speedMultiplier:int=1):void { var sp:MeteorSpawn = spawnPool.object; sp.init(x, y,velocityVec,speedMultiplier); spawns.push(sp); } } }