我正在制作游戏,我想在一个条件为真和正在运行的表达式之间暂停一下。下面的注释行显示了我要在哪里暂停,而我想要的 种类 就像这样(不起作用):
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;
答案 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
}
这只是一个可能的简化答案,可以使用许多技术和模式来更有效地构建代码。
但是,关键是要记住,如果您需要“等待”并且您正在使用主循环,那么您真正想要做的就是跳过部分代码,直到需要等待,直到条件为真为止。 ,但请确保其他所有内容正常运行。