在不停止其余代码的情况下延迟Javascript中的操作

时间:2019-05-30 05:56:22

标签: javascript

尝试延迟游戏中的射击,该动作是通过单击来完成的,但目前,它会在按住click的同时拍摄每一帧。

SetTimeInterval在我的情况下不起作用,因为它只是循环了函数 SetTimeout不能正常工作,因为它会在播放第二秒和间隔之后停止该功能。 尝试了睡眠功能,但在运行时会冻结代码

//sleepcode
var sleep = function(delay) {
    var start = new Date().getTime();
    while (new Date().getTime() < start + delay);
} 
//called by:
if(self.pressingAttack){
    self.shootBullet(self.mouseAngle);
    sleep(3000);
}

我想要一种功能,它可以击中第二秒钟,但会延迟第二发子弹,类似于以往的任何射击游戏。

3 个答案:

答案 0 :(得分:0)

您无法按照自己的方式做自己想做的事。 设计的JavaScript 不具有“睡眠功能”。

从您所说的看来,您似乎在动画帧处理程序内进行了检查,以测试按钮是否被按下,如果触发,则触发操作。为了防止此操作在接下来的三秒钟内触发,只需检查距上一次触发该操作是否已经三秒钟:

hexa = struct.unpack('H',struct.pack('e',dec_float))[0]
hexa = hex(hexa)
hexa = hexa[2:]

答案 1 :(得分:0)

您必须对“睡眠”使用承诺。

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

要使用Promise等待,IE使用await,您只能在异步函数中执行此操作。还应该注意的是,您不希望在主游戏循环中这样做,因为代码将停止并等待...因此您的主循环需要调用攻击循环而不是等待它。

async function Attackloop() {

// some code

     while (self.pressingAttack) {
         self.shootBullet(self.mouseAngle);
         await sleep(3000);
     }

// some code.

}

答案 2 :(得分:-1)

您可以使用set timeout函数来延迟执行。

if(self.pressingAttack){
     setTimeout("shootBullet", 3000);
}


function shootBullet()
{
self.shootBullet(self.mouseAngle);
}