私はRTSゲームを書いていますが、ユーザーアクションを「コマンド」にカプセル化したいです。コマンドにより、次のことが可能になります。
- ネットワークを介して他のプレイヤーにユーザーアクションを送信するので、他のプレイヤーが何をしているのかを誰もが知っています
- 再生機能を有効にするためにユーザーアクションをファイルに記録する
- 不正行為(の1つの形式)を防ぐために、実行前に各アクションを検証します
- 分類アクション。たとえば、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ステートメントに依存することを回避する方法でこのシステムを実装する方法は何でしょうか?
ありがとうございました。