Skip to content

服務器 API » 計時器事件

對於 計時器事件, 建議使用 Room 實例提供的 this.clock 的功能.

Tip

Room 被銷毀時, 註冊在 this.clock 上的重復計時器和超時計時器 都會被自動清除.

註意

JS 自帶的 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