数组选择中的Javascript对象

Javascript Objects in array selection

本文关键字:Javascript 对象 选择 数组      更新时间:2023-09-26

你好,stackoverlowians~!

是我,一个孤独的程序员,在我的探索过程中遇到了一个问题。你看问题出在这段代码上。

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++;
                    }
                }
            }
        }

问题如下。我有两个数组,里面有对象;一个数组包含所有项目符号对象的项目符号和一个猪阵列,它容纳了所有的猪(在我的游戏中要射击的目标)(然而,我不鼓励以任何方式射杀猪)

现在我要做的是看看阵列中的一颗子弹是否击中了阵列中的其中一个清管器,我已经将清管器和子弹添加到阵列中,如下所示:

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循环中,我检查是否有子弹击中了猪。然而,只有当我碰到一只不是数组中最后一只的猪时,错误才会弹出。

有人知道我的代码是怎么回事吗?我已经处理这个问题好几天了,我不知道自己做错了什么。提前感谢!

代码有两个问题:

  • 您正在使用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
      }
    }
  }
}

如果清管器命中,这将从清管器阵列中移除清管器

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总是删除数组的最后一项。