Move ship based on angle AS3
Posted 30 June, 2008 in Other Stuff
Imagine you are writing a game and you have a space ship that needs to move towards a target in a smooth fasion. It needs to turn towards the target, all the while moving forwards. The following is a function/method in a class used to control the movement of the ships in the game. The ships all have home worlds that the ships will head for.
public function ShipControler(e:Event):void {
var ss = e.target; // Set ss to the event target. ss is nicer to use than e.target
// Get target x,y of target
var tx:Number = world[ss.targ].x; // ss.targ is a number. It is the ID of the world the ship is heading for
var ty:Number = world[ss.targ].y; // ss.targ needs to be defined in the ship's own object
var dist_x:Number = tx - ss.x; // Distance to target on X axis
var dist_y:Number = ty - ss.y; // Distance to target on Y axis
var angle:Number = Math.atan2(dist_y, dist_x); // The angle of target relative to ship in radians
var ta:Number = angle/Math.PI*180; // The angle of target relative to ship in degrees
var range:Number = Math.sqrt(Math.pow(dist_x,2) + Math.pow(dist_y,2)); // Distance to target
// Calculate closest angle to turn ship
// There might well be a cleverer way to do this, but my brain started melting so I did this.
// It works out if the ship needs to turn left or right depending on which every way has the
// smallest angle. Imagine moving the ship to face angle 0 (facing right) then moving
// the target so that it still has the same relative position. If the target's angle is
// less that 0 the ship needs to turn left. If the target's angle is more than 0 the
// ship needs to turn right.
if (ss.rotation < 0){
ta = ta + ss.rotation * -1;
if(ta > 180){ta = ta - 360;}
}else{
ta = ta - ss.rotation;
if(ta < -180){ta = ta + 360;}
}
var rot:Number = new Number; // How fast and which direction the ship turns
if(ta > 0 ){
rot = 5;
}else{
rot = -5;
}
if(range < 30){rot = rot * -1;} // Turn ship away if too close to target
ss.rotation += rot; // Turn the ship
// Move ship forward based on ship's angle
var ssangle:Number = ss.rotation * Math.PI / 180; // Ship's angle in radians
var speed:Number = 2; // Set the speed of the ship
ss.x = ss.x + speed*Math.cos(ssangle); // Move the ship on the X axis
ss.y = ss.y + speed*Math.sin(ssangle); // Move the ship on the y axis
}
1 comment to “Move ship based on angle AS3”
Trigonometri och annat ”kul”, i AS3 « Gustav Nilsson's Blog, February 21st, 2010 at 10:56 pm:
-
[...] i AS3 Har jobbat lite med AS3 radianer och har lyckats pussla ihop en fungerande kod utefter den här tutorialen, vilken jag fann lätt att förstå och så finns det roliga comics där också [...]




