条件为假时如何暂停

时间:2018-10-08 23:59:55

标签: javascript

我正在制作游戏,我想在一个条件为真和正在运行的表达式之间暂停一下。下面的注释行显示了我要在哪里暂停,而我想要的 种类 就像这样(不起作用):

while (bullet.yPos >= 0) {}; //Tried, failed

因此,我希望我的代码在 时停止 ,然后在bullet.yPos小于0时继续执行0。

bullet.yPos

我应该怎么做?

编辑:这是相关方法:

bullet.hidden = true;
//I want the pause here, and the line below to be executed when bullet.yPos is less than 0
bullet.hidden = false;

2 个答案:

答案 0 :(得分:1)

您可以与实例一起创建bin。我在这里简化,但是总体思路就在那里。

Promise

现在,在您提供的方法中,您可以使用const yGreaterThanZero, { resolve } = new Promise();,它完全符合您的期望

await yGreaterThanZero

此外,在更新check: async function() { for (var i = 0; i < this.aliens.length; i++) { var item = this.aliens[i]; if ((bullet.lockedXPos >= item.xPos) && (bullet.lockedXPos <= item.xPos + this.size) && (bullet.yPos >= item.yPos) && (bullet.yPos <= item.yPos + this.size)) { item.hit = true; bullet.hidden = true; // while (bullet.yPos >= 0) {}; await yGreaterThanZero; // this bit here is key bullet.hidden = false; } } }, 的地方,您需要添加以下内容:

bullet.yPos

当然,变量名应该是语义的,因此您不应该仅将其命名为if (bullet.yPos >= 0) resolve();。但是,只要您还告诉JS 何时该条件发生,就足以等待某个条件。

重要说明:该函数是resolve的缩写,因此您需要在使用它的地方调整其他代码位,以便等待(并根据需要等待这些函数)。

答案 1 :(得分:0)

如果您在JavaScript中使用了spin loop(这是您编写的循环类型),则其他任何代码都不会最终执行。曾经只是循环中的代码。那是因为javascript(通常)是单线程的,所以直到函数返回之前,其他函数都无法运行。

因此,在这种情况下,您需要重组代码。一种常见的方法是使主循环每秒大约调用一次其他函数(通常比其他循环更快,通常每帧调用一次)。然后,您将像这样重写代码:

//in main loop
…
let bullet = createBullet() // makes a hidden bullet
handleBullet(bullet)
…

function handleBullet(bullet) {
  if (bullet.yPos >= 0) return
  bullet.hidden = false
}

这只是一个可能的简化答案,可以使用许多技术和模式来更有效地构建代码。

但是,关键是要记住,如果您需要“等待”并且您正在使用主循环,那么您真正想要做的就是跳过部分代码,直到需要等待,直到条件为真为止。 ,但请确保其他所有内容正常运行。