代码之家  ›  专栏  ›  技术社区  ›  Jack Bashford

条件为假时如何暂停

  •  2
  • Jack Bashford  · 技术社区  · 6 年前

    我在做一个游戏,我想在一个条件为真和一个表达式运行之间有一个停顿。下面的注释行显示了我想要暂停的位置,以及

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

    所以我希望我的代码停止 虽然 bullet.yPos 大于或等于0,然后在 项目符号.yPos 小于0。

    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;
    

    编辑:以下是相关方法:

    check: 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) {};
                bullet.hidden = false;
    
    
            }
    
        }
    
    },
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   jhpratt    6 年前

    您可以创建 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();

    当然,变量名应该是语义的,所以不应该只调用它 resolve . 但是,如果您也告诉JS,那么等待某个条件就足够了 什么时候 这种情况发生了。

    重要提示:函数 async

        2
  •  0
  •   Garrett Motzner    6 年前

    当你有一个 spin loop

    所以在这种情况下,您需要重新构造代码。一种常见的方法是让主循环每隔一秒左右调用一次其他函数(通常比这更快,通常每帧调用一次)。然后,将代码重写为:

    //in main loop
    …
    let bullet = createBullet() // makes a hidden bullet
    handleBullet(bullet)
    …
    
    function handleBullet(bullet) {
      if (bullet.yPos >= 0) return
      bullet.hidden = false
    }
    

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

    但是,关键是要记住,如果您需要“等待”并且正在使用主循环,那么您真正想要做的是跳过代码的一部分,直到需要等待,直到条件为真,但是请确保 继续工作。