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
  }

Share and Enjoy:
  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • Reddit
  • StumbleUpon
  • Twitter
  • Yahoo! Buzz

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å [...]

Your comment: