繁体   English   中英

setTimeout() 只运行一次,多次调用时

[英]setTimeout() only running once, when called multiple times

所以,我想要完成的是一个伤害系统,所以当敌人靠近玩家时(玩家在屏幕上的位置)他们会受到伤害。 但是,由于屏幕上同时有多个敌人,我不希望玩家被 10 个堆栈轰炸并立即死亡。 所以这是我的解决方案。

createjs.Ticker.addEventListener("tick", damage1);

function drop() {
    if (eX > p1.x - 40 && eX < p1.x + 40) {
        health -= 1;
        console.log("Health is: " + health);
    }
}

function damage1() {
    for (x = 0; x < enemy.length; x++) {
        eX = enemy[x].x;
        eY = enemy[x].y;
        if (eY > p1.y - 25 && eY < p1.y + 25) {
            setTimeout(drop, 2000);
        }
    }
}

然而,这并不像我预期的那样工作。 我认为会发生的是,如果 if 语句通过,它将设置超时,等待 2 秒,然后进入它带走健康的函数。 然而,实际发生的是它到了超时,等待 2 秒,然后每滴答运行一次外卖健康命令,所以它只等待一次。

我正在 adobe animate, html5 canvas 中工作,如果这有什么改变的话

setTimeout函数基本上是在同一时间调用的,但调用的是enemy.length次,因为 for 循环的每次迭代不会等待setTimeout回调完成。 如果将console.log添加到drop函数中,您会看到它被多次调用。 如果您希望在 for 循环中为每个索引添加延迟,您可以更改为:

setTimeout(drop, 2000 * (x + 1))

即使有适当的延迟,遍历敌人的长度仍然会带走相同数量的生命值,只是延迟。

我会做的是取消健康,禁用命中检测,然后设置一个计时器,在此期间玩家是无敌的。 这样玩家一次击中一击并有时间逃跑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM