Skip to content

服务器 API » 定时事件

对于 定时事件, 建议使用 Room 实例中的 this.clock 方法.

Tip

Room 被释放时, 注册在 this.clock 上的重复计时和超时计时都会被自动清除.

重要

内置 setTimeoutsetInterval 方法依赖 CPU 负载, 可能造成更多的时间延迟.

Clock

在状态同步事件机制之外, Clock 提供了另一种思路. 举一个使用案例: 当一名玩家获得某植物之后, 可以用 clock.setTimeout 来刷新长出的植物. 使用 clock. 的好处就在于无须关心房间状态更新变化, 可以专注计时程序而脱离状态机制.

公开方法

备注: time 参数以毫秒为单位

clock.setInterval(callback, time, ...args):Delayed

setInterval() 方法会重复调用一个函数或执行一个代码段, 每次调用之间有固定的时间间隔. 它返回 Delayed 实例作为 id, 以便后续操控.

clock.setTimeout(callback, time, ...args):Delayed

setTimeout() 方法会设置一个定时器, 定时器到期时会执行一个函数或特定代码段. 它返回 Delayed 实例作为 id, 以便后续操控.

示例

此 MVP 示例展示的功能有: setInterval(), setTimeout 及清理之前储存的 Delayed 实例; 使用房间时钟显示当前时间. 每一秒钟 'Time now ' + this.clock.currentTimeconsole.log 打印处理, 之后再过 10 秒清理计时器: this.delayedInterval.clear();.

// 导入 Delayed
import { Room, Client, Delayed } from "colyseus";

export class MyRoom extends Room {
    // 这个例子中
    public delayedInterval!: Delayed;

    // 房间初始化时
    onCreate(options: any) {
        // 时钟开始计时
        this.clock.start();

        // 设置间隔计时并保存其引用
        // 以便后续清理工作
        this.delayedInterval = this.clock.setInterval(() => {
            console.log("Time now " + this.clock.currentTime);
        }, 1000);

        // 10 秒过后清理计时器;
        // 这会让计时器 *停止并销毁*
        this.clock.setTimeout(() => {
            this.delayedInterval.clear();
        }, 10_000);
    }
}

clock.clear()

使用 clock.setInterval()clock.setTimeout() 清除所有已注册的间隔计时器和超时计时器.

clock.start()

开始计时.

clock.stop()

停止计时.

clock.tick()

模拟时间步. 在 tick 期间会遍历所有 Delayed 实例.

Tip

更多信息请参考 Room#setSimiulationInterval().

公开属性

clock.elapsedTime

clock.start() 方法被调用后经过的时间, 以毫秒计. 只读.

clock.currentTime

当前时间, 以毫秒计. 只读.

clock.deltaTime

当前clock.tick()调用与上次调用之间经过的时间, 以毫秒计. 只读.

Delayed

延迟实例由 clock.setInterval()clock.setTimeout() 方法所创建.

公开方法

delayed.pause()

在指定 Delayed 实例上暂停计时. (elapsedTime 不再增加, 直到调用 .resume().)

delayed.resume()

在指定 Delayed 实例上恢复计时. (elapsedTime 将会继续正常增加)

delayed.clear()

清除超时计时或间隔计时

delayed.reset()

重置计时器

公开属性

delayed.elapsedTime: number

Delayed 实例记录的时间, 自开始计时起, 以毫秒计.

delayed.active: boolean

如果计时器在工作中, 则返回 true.

delayed.paused: boolean

如果计时器已用 .pause() 暂停工作, 则返回 true.

Back to top