0

大家好,我正在尝试使用 jquery 和 jquery-collision 制作太空射击游戏。我几乎完成了,但一个问题是,每次我按下spacebar拍摄它只会创建相同的 ID 和类的projectilediv。因此,如果第一个projectile是在空白的一侧射击而另一个是朝敌人射击,那么在击中后它们两个会同时消失。以下是代码:

function spawnBullet() { 
$("#content").append($("<div />")
.attr('id', 'projectile1')
.addClass("projectile")
.css({ "left" :  $('#fighter').offset().left + 25, 'top' : $('#fighter').offset().top - 20 })); 
}

function processBullet() {
$(".projectile").each(function() {
    var maxTop = $(this).offset().top;
    var breakable = $(".projectile").collision( "#boss" );
    //console.log(maxTop);
    $(this).css("top", maxTop - 3);
    if (maxTop <= 110 || breakable.length != 0) {
      $('#projectile1').remove();
      $("#score").html(++score);
    }

    if (breakable.length != 0) {
       breakable.remove();
       sound.play();
       spawnEnemy();
     }
});
}
setInterval(processBullet, 50);

function shoot() {
$(document).keydown(function(event) {
switch (event.keyCode) {
case 32:
    spawnBullet();
    break;
}
});
}

我想为每个spawnBullet()调用创建不同的基于 id 的 div。但我想不出任何想法。迫切需要帮助。肿瘤坏死因子。

4

2 回答 2

2

您可以通过维护一个每次递增的全局计数器来创建唯一 ID,然后将该数字附加到您要使用的任何根名称的末尾。

例如:

var idCntr = 0;

function spawnBullet() { 
    $("#content").append($("<div />")
        .attr('id', 'projectile' + idCntr++)
        .addClass("projectile")
        .css({ "left" :  $('#fighter').offset().left + 25, 'top' : $('#fighter').offset().top - 20 })); 
}

如果你不想创建一个新的全局变量或者想保护它不被篡改,你可以把它放在一个闭包中:

var spawnBullet = (function() {
    var idCntr = 0;

    return function () { 
        $("#content").append($("<div />")
            .attr('id', 'projectile' + idCntr++)
            .addClass("projectile")
            .css({ "left" :  $('#fighter').offset().left + 25, 'top' : $('#fighter').offset().top - 20 })); 
    }
})();

在其他情况下,当前时间(以毫秒为单位)用作一个足够独特的 id,尽管如果在紧密循环中多次使用它时必须小心,因为您可能会以这种方式获得相同的时间值,但您不会得到如果您在每个用户事件中使用一次,则相同的时间值:

        .attr('id', 'projectile' + new Date().getTime())

如果您没有将此 id 保存在某处,我可能会问您为什么还需要它?

于 2014-08-22T14:57:22.990 回答
1

我不完全确定其中一些事情是如何工作的,这可能还有一段路要走。您使用循环遍历每个射弹

$(".projectile").each(function() {...})

在每次迭代期间,您测试是否有任何子弹碰撞使用

var breakable = $(".projectile").collision( "#boss" );

只测试正在迭代的子弹没有意义吗?

var breakable = $(this).collision( "#boss" );

接着

if (maxTop <= 110 || breakable.length != 0) {
  $(this).remove();

好处是您根本不需要 id。

于 2014-08-22T15:29:33.917 回答