Tony Santos
Tony Santos

Reputation: 45

Array as3 collisions help coding

I need some help here i can't do collisions because its "undefined" i guess i need to make and array to check it but i need help doing it never done it before :/ Having some difficulties here tried some arrays but no success new at javascript need help well appreciated anyone who helps

/* Código que pára a timeline na 1 frame para que o menu continue apresentado*/
stop();
/*Movimenta a nave fazendo a seguir os movimentos do rato e esconde o cursor do sistema operacional*/

stage.addChild(arma_tiro);
arma_tiro.mouseEnabled = false;
arma_tiro.addEventListener(Event.ENTER_FRAME, fl_CustomMouseCursor);

function fl_CustomMouseCursor(event:Event)
{
    arma_tiro.x = stage.mouseX;
}
Mouse.hide();


/* Mouse Click Event
Clicking on the specified symbol instance executes a function in which you can add your own custom code.

Instructions:
1. Add your custom code on a new line after the line that says "// Start your custom code" below.
The code will execute when the symbol instance is clicked.
*/

stage.addEventListener(MouseEvent.CLICK, fl_MouseClickHandler_3);

function fl_MouseClickHandler_3(event:MouseEvent):void
{


    var bullet:bullet_ = new bullet_();
    addChild(bullet);
    bullet.x=arma_tiro.x;
    bullet.y=arma_tiro.y;
    bullet.addEventListener(Event.ENTER_FRAME, moverbala);

}

function moverbala(event:Event):void // função para mover a bala para cima */
{
    event.target.y=event.target.y-20;
}

//stage.addEventListener(Event.ENTER_FRAME, Primeira);

setInterval(Primeira, 1000) ; //define intervalo de tempo entre as varias repetiçoes da funçao
function Primeira(){  //funçao de spawn de nave 1

    var invader1:invader_1 = new invader_1();
    addChild(invader1);
    invader1.x=0;
    invader1.y=15;
    invader1.addEventListener(Event.ENTER_FRAME, mover1);
} 

function mover1(event:Event):void // função para mover a nave para lado direito */
{
    event.target.x+=10;
}

//Nave 2

setInterval(Segunda, 1000) ; //define intervalo de tempo entre as varias repetiçoes da funçao
function Segunda(){  //funçao de spawn de nave 1

    var invader2:invader_2 = new invader_2();
    addChild(invader2);
    invader2.x=0;
    invader2.y=45;
    invader2.addEventListener(Event.ENTER_FRAME, mover2);
} 

function mover2(event:Event):void // função para mover a nave para lado direito */
{
    event.target.x+=10;
}

//Nave 3

setInterval(Terceira, 1000) ; //define intervalo de tempo entre as varias repetiçoes da funçao
function Terceira(){  //funçao de spawn de nave 1

    var invader3:invader_3 = new invader_3();
    addChild(invader3);
    invader3.x=0;
    invader3.y=85;
    invader3.addEventListener(Event.ENTER_FRAME, mover3);
} 

function mover3(event:Event):void // função para mover a nave para lado direito */
{
    event.target.x+=10;
}

if (bullet.hitTestObject(invader1))
        {
            //Remove bullet and enemy
            removeChild(bullet);
            removeChild(invader1);

        }

Upvotes: 0

Views: 48

Answers (1)

Benjamin BOUFFIER
Benjamin BOUFFIER

Reputation: 946

it seems that bullet_ is a class and not an instance so you cannon call hitTestObject on it. maybe try replace bullet_ by bullet.

there are many solution to do that but the simplest for me would be to keep 2 array, one for the bullets, one for the enemies.

so add arrays:

// create the array for the bullets
bullets  :Array = [];
// create the array for the enemies
enemies :Array = [];

add an onEnterFrame event listener to do the tests and the game logic on each frame:

addEventListener( Event.ENTER_FRAME, _gameLoop );

change your function to create bullets and enemies:

function fl_MouseClickHandler_3( event:MouseEvent ):void
{
    // create the bullet
    var bullet:bullet_ = new bullet_();
    addChild(bullet);
    bullet.x=arma_tiro.x;
    bullet.y=arma_tiro.y;

    // add the bullet to the bullets array
    bullets.push( bullet );
}

function Primeira():void
{
    var invader1:invader_1 = new invader_1();
    addChild(invader1);
    invader1.x=0;
    invader1.y=15;

    enemies.push( invader1 );
}

function Segunda():void
{
    var invader2:invader_2 = new invader_2();
    addChild(invader2);
    invader2.x=0;
    invader2.y=45;

    enemies.push( invader2 );
} 

function Terceira():void
{
    var invader3:invader_3 = new invader_3();
    addChild(invader3);
    invader3.x=0;
    invader3.y=85;

    enemies.push( invader3 );
} 

now create the game loop function:

function _gameLoop(e:Event):void
{
    var firstLoop:Boolean = true;

    // loop to move/remove the bullets
    for( var a:int = bullets.length-1; a>=0; a-- )
    {
        bullets[a].y -= 20;
        // if the bullet is not on screen anymore, remove it from array
        if( bullets[j].y < 0 )
        { 
            removeChild( bullet[a] );
            bullets.splice(a,1);
            continue;
        }
    }

    // loop enemies
    for( var i:int = enemies.length-1; i>=0; i-- )
    {
        // move the enemy
        enemies[i].x += 10;
        // loop the bullets to see if on collide the enemy
        for( var j:int = bullets.length-1; j>=0; j-- )
        {
            // test collision with the enemy
            if( enemies[i].hitTestObject( bullets[j] )
            {
                // make your enemy dead
                removeChild( enemies[i] );
                // remove it from the array
                enemies.splice(i,1);
            }
        }
    }
}

Hope this could helps you

Upvotes: 1

Related Questions