Phaser.js在forEach循环期间删除组中的对象

时间:2016-01-23 16:00:20

标签: javascript phaser-framework

我希望在传递某个x值后销毁它。 这些对象是称为球的移相器组的一部分。 在我的更新循环中,我有这行代码:

balls.forEach(updateBalls, null, true);

这是updateBalls函数:

function updateBalls(ball) {
  if (ball.x > 800) {
    ball.destroy();
  }
}

问题是在循环中删除对象会弄乱循环,这是我得到的错误:

  

TypeError:this.children [i]未定义

我试图将每个球推到一个阵列,然后像这样摧毁每个球。

function updateBalls(ball) {
  if (ball.x > 800) {
    ballsToDestroy.push(ball);
  }
}

然后在更新循环中:

balls.forEach(updateBalls, null, true);
for (x = 0; x < ballsToDestroy.length; balls++) {
    ballsToDestroy[x].destroy();
}

这给了我一些奇怪的错误 如果我使用ball.kill(),它会起作用,但这最终会导致游戏滞后,因为实际上没有移除球。

我怎样才能解决这个问题?

1 个答案:

答案 0 :(得分:4)

如果在迭代期间在组中的某个对象上调用destroyGroup#forEach失败,则听起来像是Phaser中的一个愚蠢的错误。

根据Phaser文档,一个组的filter函数返回ArraySet。所以你可以得到ArraySet个球来摧毁:

var toDestroy = balls.filter(function(ball) { return ball.x <= 800; });

然后ArraySet说它有一个方便的callAll函数,可以让我们在所有条目上调用一个函数。所以我们可以用它来摧毁它们:

toDestroy.callAll('destroy');

一体化:

balls.filter(function(ball) { return ball.x <= 800; }).callAll('destroy');

或使用ES2015 +

balls.filter(ball => ball.x <= 800).callAll('destroy');

(彼此附近的=><=看起来很有趣,但不要担心,第一个引入箭头功能,第二个是小于 - 或等于运算符。)