1

我首先尝试了一个 forEach 循环来从数组中删除项目,但后来才知道你不应该这样做。所以我试着用一个普通的 for 循环来做一个。这是循环遍历包含子弹的数组,并在它们超出游戏区域时将其删除。

for (i = 0; i < playerBullets.length; i++) {
console.log(playerBullets[i].x);
console.log(playerBullets[i]);
if (playerBullets[i].x > 800 || playerBullets[i].x < 0 || playerBullets[i].y > 600 || playerBullets[i].y < 0 ) {
playerBullets.splice(i);
}
}     

控制台正确显示完整的 [i],并显示数组所有内容的列表。但是,[i].x 控制台日志只显示一个值,而不是数组中每个对象的“x”值。

然后,一旦第一颗子弹出界,所有子弹就会消失。最令人沮丧,并且对于杀死僵尸非常无效。

我还尝试通过循环向后循环,这似乎是推荐的方式,但它告诉我 i 未定义。

有任何想法吗?我觉得我犯了一个非常简单的错误,因为我使用的结构与教程网站上的代码相同,所以它“应该工作”。

谢谢!

4

2 回答 2

4

您应该将两个参数传递给.splice()方法,开始索引(您正在执行)和要删除的元素数(您没有执行):

playerBullets.splice(i, 1);

向后循环是一个好主意的原因是,如果您在遍历数组时从数组中间删除一个项目,那么您的索引i将不同步 - 删除后的每个项目的索引都会减少 1 等等下一次循环迭代,i++您跳过删除的元素之后的元素。如果向前循环,您需要i在删除项目后减少 1。如果向后循环,这不是问题。

我猜你undefined在尝试向后循环时得到了,因为你从 开始playerBullets.length,这比最后一项的索引多 1。您需要从 0 开始playerBullets.length - 1并下降到 0:

for (i = playerBullets.length - 1; i >= 0; i--) {
  if (playerBullets[i].x > 800 || playerBullets[i].x < 0 || playerBullets[i].y > 600 || playerBullets[i].y < 0 ) {
    playerBullets.splice(i, 1);
  }
}  
于 2013-05-18T21:24:01.343 回答
1

向 splice 添加另一个参数:array.splice(i, howMany);

以下是有关 splice 的更多信息

如果未指定 howMany 参数,则删除 index 之后的所有元素。

于 2013-05-18T21:25:09.383 回答