首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当多次调用时,setTimeout()只运行一次

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

Stack Overflow用户
提问于 2020-11-21 15:07:24
回答 2查看 140关注 0票数 2

所以,我试图实现的是一个伤害系统,所以当敌人靠近玩家时(玩家在屏幕上),他们就会受到伤害。然而,由于在同一时间屏幕上有多个敌人,我不希望玩家被10个堆栈轰炸并立即死亡。所以这是我的解决方案。

代码语言:javascript
复制
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画布上工作,如果这能改变什么的话

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-21 16:02:26

即使有适当的延迟,重复敌人的长度仍然会夺走相同数量的生命,只是,是的。一次延迟。

相反,我会做的是取消生命值,禁用命中检测,然后设置一个计时器,在此期间玩家是无敌的。这样,玩家可以一次击球一次,并有时间跑开。

票数 2
EN

Stack Overflow用户

发布于 2020-11-21 15:32:55

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

代码语言:javascript
复制
setTimeout(drop, 2000 * (x + 1))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64940655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档