简体   繁体   中英

gameQuery collision detection

it is the first time for me to explore jQuery and gameQuery for building games using JavaScript, so am asking about sth that might look very naive, but really i cant get it.

i am developing a game like Space Invader, the detection for collision between player missile and enemies not working.

This is my code:

the definition for my Enemy class

function Enemy(node){
    this.node = $(node);
    this.pts_value = 0;
    return true;
}

this is the code i use to add ten enemy sprite next to each other. the enemies move together to the left and the right

$.each(new Array(10), function(index, value) {
    $("#enemy_group").addSprite("enemy2_"+index,{animation: enemies[2],
         posx: index * 55, posy: 0, width: 48, height: 48})
    $("#enemy2_"+index).addClass("enemy");
    $("#enemy2_"+index)[0].enemy = new Enemy($("#enemy2_"+index));
    $("#enemy2_"+index)[0].pts_value = 150;
});

so when i need to move the enemies, i move the enemies together, i move the group that includes all the sprites "#enemy_group"

    if(ENEMY_TO_RIGHT){
        var enemiesNewPos = (parseInt($("#enemy_group").css("left"))) + ENEMY_SPEED;
        if(enemiesNewPos < PLAYGROUND_WIDTH - 550){
            $("#enemy_group").css("left", ""+enemiesNewPos+"px");
        } else {
            ENEMY_TO_RIGHT = false;
        }
    } else {
        var enemiesNewPos = (parseInt($("#enemy_group").css("left"))) - ENEMY_SPEED;
        if(enemiesNewPos > 0){
            $("#enemy_group").css("left", ""+enemiesNewPos+"px");
        } else {
            ENEMY_TO_RIGHT = true;
        }
    }

finally for collision detection, i want to remove the enemy sprite that the players missile has hit, each missile sprite has an added class names ".playerMissiles"

    $(".playerMissiles").each(function(){
        var posy = parseInt($(this).css("top"));

        if(posy < 0){
            $(this).remove();
            return;
        }

        $(this).css("top", ""+(posy - MISSILE_SPEED)+"px");
        //Test for collisions
        var collided = $(this).collision(".enemy, .group");
        if(collided.length > 0){
            //An enemy has been hit!
            collided.each(function(){
                $(this).setAnimation(enemies[0], function(node){$(node).remove();});
            })

        }
    });

i was following the documentation tutorial on the gameQuery website.

any help appreciated, thanks,

I can't see any problem with your code. I can only give you a few pointers:

  • Did you create "enemy_group" with the addGroup function?
  • Is "enemy_group" nested in something special like a custom div? for the collision detection to work you need a chain of parent composed only of sprites and groups (and tiles map)
  • Is "enemy_group" nested in a sprite, if so it's a bad idea because you will need to add the selector for this sprite in your methode call and this sprite will be included in the colliding element list.
  • The same goes for the ".playerMissiles"

Just to be sure what version of gameQuery and jQuery do you use? The last version from gitHub is unstable and I wouldn't recomend using it, user 0.5.1 instead.

You could use jquery collision plugin, so you avoid doid the logic by yourself.

Hope this helps. Cheers

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM