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

Wea*_*tie 4 javascript phaser-framework

我要销毁某个对象,使其通过某个x值。这些对象是称为“球”的移相器组的一部分。在我的更新循环中,我有以下代码行:

balls.forEach(updateBalls, null, true);
Run Code Online (Sandbox Code Playgroud)

这是updateBalls函数:

function updateBalls(ball) {
  if (ball.x > 800) {
    ball.destroy();
  }
}
Run Code Online (Sandbox Code Playgroud)

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

TypeError:this.children [i]未定义

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

function updateBalls(ball) {
  if (ball.x > 800) {
    ballsToDestroy.push(ball);
  }
}
Run Code Online (Sandbox Code Playgroud)

然后在更新循环中:

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

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

我该如何解决?

T.J*_*der 5

听起来像是Phaser中的一个愚蠢的错误,如果在迭代过程中Group#forEach调用destroy组中的一个对象时失败了。

根据Phaser文档,Group具有一个filter返回的函数ArraySet。这样您就可以ArraySet摧毁其中的一个球:

var toDestroy = balls.filter(function(ball) { return ball.x <= 800; });
Run Code Online (Sandbox Code Playgroud)

然后ArraySet说它有一个方便的callAll函数,可以让我们在所有条目上调用一个函数。因此,我们可以使用以下方法销毁它们:

toDestroy.callAll('destroy');
Run Code Online (Sandbox Code Playgroud)

一体:

balls.filter(function(ball) { return ball.x <= 800; }).callAll('destroy');
Run Code Online (Sandbox Code Playgroud)

或搭配ES2015 +

balls.filter(ball => ball.x <= 800).callAll('destroy');
Run Code Online (Sandbox Code Playgroud)

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