我正在编写一个 RTS 游戏,我想将用户操作封装成“命令”。命令将允许:
- 通过网络将用户操作发送给其他玩家,因此每个人都知道其他人在做什么
- 记录用户对文件的操作以启用重播功能
- 在执行之前验证每个动作以防止(一种形式的)作弊
- 分类动作,例如只导致 UI 变化的动作(移动相机)、改变游戏状态的动作(移动单位)、只有地图编辑器才能发出的动作(改变地形)等。
他们还必须增加最小的开销。因此,我想避免使用反射。到目前为止,我想出的最好的结果很糟糕,因为我不可避免地会得到一个巨大的 switch 语句。
enum CommandType {
MoveCamera,
ChangeTerrain
}
// Base class for all commands (public fields used for brevity)
abstract class Command {
protected Command(CommandType type) {
Type = type;
}
public CommandType Type;
}
class CommandMoveCamera : Command {
public CommandMoveCamera() : base(CommandType.MoveCamera) {}
public int DeltaX;
public int DeltaY;
}
class CommandChangeTerrain : Command {
public CommandChangeTerrain() : base(CommandType.ChangeTerrain) {}
public int NewTerrainType;
public int X;
public int Y;
}
class Game {
Queue<Command> m_commands;
void Update() {
// Example of adding a command
m_commands.Enqueue(new CommandMoveCamera { DeltaX = -10, DeltaY = 0 });
// Processing commands
while (m_commands.Count > 0) {
var c = m_commands.Dequeue();
switch(c.Type) {
case CommandType.MoveCamera:
var command = (CommandMoveCamera)c;
MoveCamera(c.DeltaX, c.DeltaY);
break;
case CommandType.ChangeTerrain:
var command = (CommandChangeTerrain)c;
ChangeTerrain(c.X, c.Y, c.NewTerrainType);
break;
}
}
}
}
语言是 C#。我的问题是:以满足要求的方式实现该系统并避免依赖于巨大的 switch 语句来分支每种不同类型的命令的方法是什么?
谢谢你。