You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于分数动态减少Phaser.js中this.time.addEvent的延迟?

解决Phaser.js中动态调整循环事件延迟的问题

问题根源:你代码里的delay参数在创建time.addEvent时就被计算为固定值(初始score为0时的1500),后续gameState.score变化不会自动更新这个值——不管是Phaser的循环事件还是原生setInterval,都会存在这个问题,因为它们只会在初始化阶段读取一次延迟参数。

以下是两种可行的解决方法:

方法一:递归创建单次事件(推荐)

放弃loop: true,改为在每次生成鸡蛋的回调结束后,重新创建一个新的时间事件,这样每次都会用最新的gameState.score计算延迟:

function eggGen() {
    // 这里写你的鸡蛋生成逻辑

    // 递归创建下一次事件,使用最新score计算延迟
    this.time.addEvent({
        delay: 1500 - (gameState.score * 100),
        callback: eggGen,
        callbackScope: this,
        loop: false
    });
}

// 初始化第一个事件
this.time.addEvent({
    delay: 1500 - (gameState.score * 100),
    callback: eggGen,
    callbackScope: this,
    loop: false
});

方法二:动态修改现有循环事件的延迟

如果坚持使用循环事件,可以直接修改事件对象的delay属性。Phaser的循环事件会在每次回调执行完毕后读取最新的delay值,所以你可以在回调里或者score变化的地方更新它:

方式1:在回调内更新延迟

const eggGenLoop = this.time.addEvent({
    delay: 1500 - (gameState.score * 100),
    callback: () => {
        // 执行原鸡蛋生成逻辑
        eggGen.call(this);
        // 更新下一次循环的延迟
        eggGenLoop.delay = 1500 - (gameState.score * 100);
    },
    callbackScope: this,
    loop: true
});

方式2:在score变化时直接更新

比如在分数增加的逻辑里:

// 假设这是分数增加的代码
gameState.score += 1;
// 直接修改事件的延迟值
eggGenLoop.delay = 1500 - (gameState.score * 100);

另外,原生setTimeout/setInterval的问题解决思路完全一致——放弃setInterval,改用setTimeout递归调用,每次重新计算延迟即可。

内容的提问来源于stack exchange,提问作者chylinski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 13:45:27