最佳实践和建议¶
本节提供一般建议和最佳惯例, 以确保您的代码库对您的团队来说是健康和可读的. 这些建议和最佳惯例都是可选的, 如果遵循它们, 将提高代码的可读性和整洁性.
- 您的房间应尽可能保持低等级, 而将特定于游戏的功能委托给其他可组合结构.
- 可同步的数据结构应尽可能较小
- 理想情况下, 每个扩展
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();
}
}
参阅更多¶
- 参考 command definitions
- 参考 用法
- 参考 implementation
实体组件系统 (ECS)¶
目前我们没有正式的 ECS(实体组件系统),尽管我们已经看到社区成员实现了他们自己的解决方案.
试验中的功能