1

你好stackoverflowians~!

是我,一个孤独的程序员,在我的足迹中遇到了问题。您会看到问题出在这段代码上。

for(var a = 0; a < bullets.length; a++) {
            for(var b = 0; b < pigs.length; b++) {
                if(bullets[a].y < 300) {
                    if(bullets[a].x > pigs[b].x && bullets[a].x < pigs[b].x + pigImage.width &&
                    bullets[a].y > pigs[b].y && bullets[a].y < pigs[b].y      + pigImage.height) {
                        pigExplode(pigs[b].x);
                        bullets.pop(a);
                        pigs.pop(b);
                        player.kills++;
                    }
                }
            }
        }

问题如下。我有 2 个数组,其中包含对象;一组 Bullets 包含所有子弹对象和一组 Pigs 包含所有猪(在我的游戏中射击的目标)(但是,我不鼓励以任何方式射击猪)

现在我要做的是查看阵列中的一颗子弹是否击中阵列中的一只猪,我已将猪和子弹添加到阵列中,如下所示:

bullets.push(new Bullet());
pigs.push(new Pig());

当我试图删除这个数组中的某个对象时,狗屎南下,假设我有 5 头猪。

那将是0、1、2、3、4。如果我要射猪2。4会死。如果我要射猪 1. 4 会死。如果我要射猪4。4会死。

因此,无论我向谁开枪,它总是会删除最后一头猪。我遇到这个问题的错误是:

Uncaught TypeError: Cannot read property 'y' of undefined 

它指示的行是这样的:

if(bullets[a].y < 300) {

这是在双重 for 循环中,我检查是否有子弹击中猪。但是,该错误仅在我击中不是阵列中最后一个的猪时才会弹出。

有谁知道我的代码发生了什么?我已经处理了好几天了,我不知道我做错了什么。提前致谢!

4

2 回答 2

3

代码有两个问题:

  • 您正在使用pop从数组中删除项目,这将始终删除最后一个项目。这就是为什么它总是杀死最后一头猪。

  • 击中后您将继续内部循环,因此您将检查不再在数组中的子弹的击中。如果您正在检查最后一个项目符号,则该变量a现在指向数组中的最后一项之外。

用于splice删除数组中的项目,向后循环遍历项目符号,这样您就可以在不弄乱循环的情况下删除一个项目,并在命中后结束内部循环:

for (var a = bullets.length - 1; a >= 0; a--) {
  for (var b = 0; b < pigs.length; b++) {
    if (bullets[a].y < 300) {
      if (bullets[a].x > pigs[b].x && bullets[a].x < pigs[b].x + pigImage.width &&
          bullets[a].y > pigs[b].y && bullets[a].y < pigs[b].y      + pigImage.height) {
        pigExplode(pigs[b].x);
        bullets.splice(a, 1);
        pigs.splice(b, 1);
        player.kills++;
        break; // end the inner loop
      }
    }
  }
}
于 2013-06-26T09:46:52.183 回答
0

如果它被击中,这将从您的猪阵列中移除猪

if(bullets[a].x > pigs[b].x && a bunch of other stuff) {
  pigExplode(pigs[b].x);
  bullets.splice(a,1);//remove bullit at a
  pigs.splice(b,1);//remove pig at b
  player.kills++;//smell bacon, jummy
  //always forget this both bullits and pigs are one shorter
  // if you dont decrease the counters you'll skip one pig and bullit
  a--;
  b--;
}

.pop 总是删除数组的最后一项。

于 2013-06-26T09:39:27.173 回答