服務器 API » 定時事件¶
對於 定時事件, 建議使用 Room 實例中的 this.clock 方法.
Tip
當 Room 被釋放時, 註冊在 this.clock 上的重復計時和超時計時都會被自動清除.
重要
內置 setTimeout 和 setInterval 方法依賴 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.currentTime 被 console.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.