Search code examples
arraysactionscript-3mathactionscriptangle

AS3 - Move Array objects relative to angle


I am creating a game where i need to move ships at a set speed towards the angle they are facing. I have used this code to move singular ships elsewhere in the game but i assume having them in an array has complicated things.

Any help would be appreciated.

var ship1 = this.addChild(new Ship());
var ship2 = this.addChild(new Ship());
var ship3 = this.addChild(new Ship());
var ship4 = this.addChild(new Ship());

var shipSpeed1 = 10;

var shipArray: Array = [];

shipArray.push(ship1, ship2, ship3, ship4);

for (var i: int = 0; i < shipArray.length; i++) { 
var randomX: Number = Math.random() * stage.stageHeight;
var randomY: Number = Math.random() * stage.stageHeight;

shipArray[i].x = randomX;
shipArray[i].y = randomY;

shipArray[i].rotation = 90;

shipArray[i].x += Math.sin(shipArray[i].rotation * (Math.PI / 180)) * shipSpeed1;
shipArray[i].y -= Math.cos(shipArray[i].rotation * (Math.PI / 180)) * shipSpeed1;

}

I've also included this within the same function, but i cant get this to work either. Once again i have had this working

if (shipArray[i].x < 0) { //This allows the boat to leave the scene and 
enter on the other side.
    shipArray[i].x = 750;
}
if (shipArray[i].x > 750) {
    shipArray[i].x = 0;
}
if (shipArray[i].y < 0) {
    shipArray[i].y = 600;
}
if (shipArray[i].y > 600) {
    shipArray[i].y = 0;
}

Solution

  • First, you need to separate your code into a spawn / initialization phase and an update phase.

    Something like the following:

    var shipArray: Array = [];
    
    //spawn and set initial values (first phase)
    //spawn 4 new ships
    var i:int;
    for(i=0;i<4;i++){
        //instantiate the new ship
        var ship:Ship = new Ship();
        //add it to the array
        shipArray.push(ship);
    
        //set it's initial x/y value
        ship.x = Math.random() * (stage.stageWidth - ship.width);
        ship.y = Math.random() * (stage.stageHeight - ship.height);
    
        //set it's initial rotation
        ship.rotation = Math.round(Math.random() * 360);
    
        //set the ships speed (dynamic property)
        ship.speed = 10;
    
        //add the new ship to the display
        addChild(ship);
    }
    
    //NEXT, add an enter frame listener that runs an update function every frame tick of the application
    this.addEventListener(Event.ENTER_FRAME, gameUpdate);
    
    function gameUpdate(e:Event):void {
        //loop through each ship in the array
        for (var i: int = 0; i < shipArray.length; i++) { 
            //move it the direction it's rotated, the amount of it's speed property
            shipArray[i].x += Math.sin(shipArray[i].rotation * (Math.PI / 180)) * shipArray[i].speed;
            shipArray[i].y -= Math.cos(shipArray[i].rotation * (Math.PI / 180)) * shipArray[i].speed;
        }
    }