最佳實踐和建議¶
本節提供一般建議和最佳實踐, 以確保您的代碼庫保持健康並對您的團隊保持可讀性. 相關建議和實踐可有可無, 但如果遵循相關建議和實踐則可提高代碼的可讀性和清潔度.
- 您的房間應盡可能保持低等級, 而將特定於遊戲的功能委托給其他可組合結構.
- 可同步的數據結構應盡可能較小
- 理想情況下, 每個擴展
Schema
的類應該只有字段定義. - 避免在
Schema
結構中實現 大量 邏輯代碼. 少量 邏輯可以接受, 尤其是結構範圍內的, 只維護自身屬性的代碼.
- 理想情況下, 每個擴展
- 房間代碼應盡可能少, 用以操作其他結構.
- 應該由其他結構處理遊戲邏輯, 例如:
單元測試¶
請參考 這裏 了解單元測試. 使用 npm init colyseus-app
初始化的應用自帶測試模板, 可根據需求自行修改.
設計模式¶
指令模式¶
指令模式有幾個優點,例如:
- 其將調用操作的類別與知道如何執行操作的物件分離.
- 它能讓您透過提供隊列系統來建立指令序列.
- 實作擴展以新增新指令很容易,無需更改現有代碼即可完成.
- 嚴格控制叫用指令的方式和時間.
- 提高代碼可讀性和單元測試的可能性.
使用方式¶
安裝
npm install --save @colyseus/command
在您的房間實現中初始化 dispatcher
:
import { Room } from "colyseus";
import { Dispatcher } from "@colyseus/command";
import { OnJoinCommand } from "./OnJoinCommand";
class MyRoom extends Room<YourState> {
dispatcher = new Dispatcher(this);
onCreate() {
this.setState(new YourState());
}
onJoin(client, options) {
this.dispatcher.dispatch(new OnJoinCommand(), {
sessionId: client.sessionId
});
}
onDispose() {
this.dispatcher.stop();
}
}
const colyseus = require("colyseus");
const command = require("@colyseus/command");
const { OnJoinCommand } = require("./OnJoinCommand");
class MyRoom extends colyseus.Room {
onCreate() {
this.dispatcher = new command.Dispatcher(this);
this.setState(new YourState());
}
onJoin(client, options) {
this.dispatcher.dispatch(new OnJoinCommand(), {
sessionId: client.sessionId
});
}
onDispose() {
this.dispatcher.stop();
}
}
指令實作看起來像這樣:
// OnJoinCommand.ts
import { Command } from "@colyseus/command";
export class OnJoinCommand extends Command<MyRoom, {
sessionId: string
}> {
execute({ sessionId }) {
this.state.players[sessionId] = new Player();
}
}
// OnJoinCommand.js
const command = require("@colyseus/command");
exports.OnJoinCommand = class OnJoinCommand extends command.Command {
execute({ sessionId }) {
this.state.players[sessionId] = new Player();
}
}
深入瞭解¶
實體組件系統 (ECS)¶
我們目前沒有正式的 ECS(實體組件系統),儘管我們已經看到社群成員實作其自己專屬的解決方案.
试验中的功能
一些工作 已開始嘗試將 ECSY 與 @colyseus/架構 結合起來.