package { import flash.display.MovieClip; import flash.events.Event; import flash.geom.Point; import Globals; public class Projectile extends MovieClip { private var speed:Number; private var sector:Sector; private var swayAmmount:Number; private var firedFrom:Point = new Point(); private var shipFiredFrom:Ship; private var damage:int = 0; private var dying:Boolean = false;//prevents double destroy() calls private var mainWep:Object; private var allegiance:int; public function Projectile($speed:Number, $angle:Number, $mainWep:Object, $sector:Sector, $shipFiredFrom:Ship) { mainWep = $mainWep; speed = $speed + parseInt(mainWep.speed, 10); rotation = $angle; sector = $sector; shipFiredFrom = $shipFiredFrom; damage = mainWep.damage; allegiance = shipFiredFrom.Allegiance; gotoAndStop(mainWep.id); x = $shipFiredFrom.x; y = $shipFiredFrom.y; swayAmmount = (Math.random() * mainWep.spread) - (mainWep.spread / 2); addEventListener(Event.ENTER_FRAME, loop); } private function loop($e:Event):void { asteroidCollisionCheck(); shipCollisionCheck(); move(); //remove if too far away if (calcDist(shipFiredFrom.x, shipFiredFrom.y) >= 800) remove(); } private function move():void { x += Math.sin(Globals.degToRad(rotation + swayAmmount)) * speed; y -= Math.cos(Globals.degToRad(rotation + swayAmmount)) * speed; } private function asteroidCollisionCheck():void { for each (var a:Asteroid in sector.Asteroids) { if (a && calcDist(a.x, a.y) < 60) { a.hit(damage); destroy(); } } } private function shipCollisionCheck():void { for each(var s:Ship in sector.getShips()) { if (s && s != shipFiredFrom && calcDist(s.x, s.y) < s.Mass) { if (s.Allegiance != allegiance)//hits enemy ship { s.projectileHit(damage); destroy(); } else { remove(); } } } } private function calcDist($targetX:Number, $targetY:Number):Number { var distX:Number = Math.abs($targetX - x); var distY:Number = Math.abs($targetY - y); return Math.sqrt(Math.pow(distX, 2) + Math.pow(distY, 2)); } ///removes the projectile without any hit effect public function remove() { if (!dying) { dying = true; removeEventListener(Event.ENTER_FRAME, loop); parent.removeChild(this); } } ///removes the projectile and adds a hit effect public function destroy() { if (!dying) { var boom:ProjectileHit = new ProjectileHit(); boom.x = x; boom.y = y; parent.addChild(boom); remove(); } } //--------------------------------------------set/get-------------------------------------------- public function get Coords():Point { return new Point(Globals.posToCoords(x), Globals.posToCoords(y)); } } }