私はRTSゲームを作成しています。ユーザアクションを「コマンド」にカプセル化したいと思います。コマンドができるようになる: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文に依存することを避けて、どのような方法でコマンドを実行するのでしょうか?
ありがとうございます。
あなたのコードに目を向けたいのであれば、[codereview](http://codereview.stackexchange.com)があなたの質問のためのより良い家になるでしょう。さもなければ、あなたがコードを掲示したときの問題に特有です。 –
私はコードのレビューを求めていませんが、コードは私が達成しようとしていることを説明するためのものです。私が探しているのは、私が述べたさまざまな要件を満たすことができる一方で、巨大なswitch文を避けるようにこのシステムを設計する方法です。 – Asik
それは、SOの意図ではありません。あなたのシステムを設計する人が必要な場合は、お金を払うことを好む仕事のソフトウェアデザイナーがたくさんいると確信しています。真剣に、しかし、あなたの質問は、おそらく、ゲームサイトや別のフォーラムを試してみてくださいに適していません。 –