-
Notifications
You must be signed in to change notification settings - Fork 0
/
Cannon.as
107 lines (93 loc) · 3.43 KB
/
Cannon.as
1
/*********************************************************************** Author: Amith Tudur This file is part of Weawars. Weawars is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Weawars is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Weawars. If not, see <http://www.gnu.org/licenses/>.***********************************************************************/package { import flash.display.*; import flash.geom.*; import fl.motion.*; import flash.events.*; import TankTex; public class Cannon extends Sprite{ private var cannonWidth:Number; private var bullets:Array; private var gunspot:Sprite; public var center:Point; private var cannon_center:Point; private var cannonLength:Number = 10; private var gsize:Number; public function Cannon( l_gsize:Number ){ gsize = l_gsize; cannon_center = new Point( gsize/2, gsize/2); var tankTex:TankTex = new TankTex( ); tankTex.width = tankTex.height = cannonLength*2; addChild( tankTex ); } public function rotateAboutCenter( deg:Number ){ var mrot:Matrix = transform.matrix; MatrixTransformer.rotateAroundInternalPoint( mrot, gsize/2, gsize/2, deg ); transform.matrix = mrot; } public function fire( ep:Point, vel:Number ){ var ep_local:Point = globalToLocal( ep ); addChild( new Bullet(cannon_center, ep_local , vel, cannonLength) ); } }}import flash.display.*;import flash.geom.*;import flash.events.*;import BulletTex;class Bullet extends Sprite{ private var startPoint:Point; private var endPoint:Point; private var thisVec:Point; public var inMotion:Boolean; private var theta:Number; //angle subtended by this bullets trajectory. private var vecLength:Number; private var t:Number; private var vel:Number; private var cannonLength:Number; public function Bullet( l_startPoint:Point, l_endPoint:Point, l_velocity:Number, l_cannonLength:Number ){ startPoint = l_startPoint; endPoint = l_endPoint; vel = l_velocity; cannonLength= l_cannonLength; thisVec = new Point( endPoint.x - startPoint.x, endPoint.y - startPoint.y ); theta = Math.atan2( thisVec.y, thisVec.x ); vecLength = Math.sqrt( thisVec.x*thisVec.x + thisVec.y*thisVec.y ); inMotion = true; x = startPoint.x; y = startPoint.y; var bulletTex:BulletTex = new BulletTex( ); bulletTex.width = bulletTex.height = 7; addChild( bulletTex ); t = 0; //start at the begenning and land the bullet at the end. alpha = 0; addEventListener( Event.ENTER_FRAME, updatePos, false, 0, true ); } public function updatePos( eve:Event ){ //update the position of the bullet till it crosses the end point. x = startPoint.x + t*vecLength*Math.cos(theta); //assuming 30 fps. y = startPoint.y + t*vecLength*Math.sin(theta); t += 1.0/30*vel; if( !alpha && (t > cannonLength/vecLength) ){ alpha = 1; } var distVec:Point = new Point( endPoint.x - x, endPoint.y-y ); if( t > 1.0 ){ alpha = 0; removeEventListener( Event.ENTER_FRAME, updatePos); parent.removeChild( this ); } }}