まず、すべてのゲームロジックを、それだけを担当するEngineクラスを使用してEngineプロジェクトに配置する必要があります(すべてのゲームのロジックを処理し、UIとフレームワーク[および存在する場合は下位レイヤー]と通信します)。 )。
次に、列挙型EngineActionType(Move、ChangePos、Disappear、...)およびその他のプロパティを持つEngineActionクラスを作成できます。一般的な考え方は次のとおりです。
タイプを保持する列挙型があります:
public enum EngineActionType
{
Move,
ChangePos,
Disappear,
...
}
すべてのエンジンアクションクラスを論理的にグループ化する抽象クラスを作成し、それらを共通のTypeプロパティで追加します。
public abstract class EngineAction
{
public readonly EngineActionType Type;
protected EngineAction(EngineActionType type)
{
this.Type = type;
}
}
必要なすべてのパラメーターをプロパティとして保持する、エンジンアクションごとのクラスを作成します。EngineActionから派生し、適切なEngineActionTypeを基本コンストラクターに送信する必要があります。
public class EngineActionMove : EngineAction
{
public int XDelta;
public int YDelta;
public EngineActionMove() : base(EngineActionType.Move)
{
}
}
public class EngineActionChangePos : EngineAction
{
...
}
...
その後、ユーザーが注文したときにこれらのオブジェクトをリストに入れ、そのオブジェクトを繰り返し処理して、タイプに応じて1つずつ実行します。
foreach (EngineAction action in actionsToDo)
{
switch (action.Type)
{
case EngineActionType.Move:
EngineActionMove mvAction = (EngineActionMove)action;
// Example:
player.Position = player.Position.Offset(mvAction.XDelta,
mvAction.YDelta);
break;
case EngineActionType.ChangePos:
EngineActionChangePos cpAction = (EngineActionChangePos)action;
// Example:
player.Position = new Point(cpAction.X, cpAction.Y);
break;
case EngineActionType.Disappear:
// Just make the player disappear,
// because the operation needs no parameters
player.Disappear();
break;
case ...:
default:
// maybe throw an error here, to find errors during development
// it helps you find non-handled action types
}
}
詳細なヒント:UIにあるロジックは少ないほど、優れています。いつも。
編集:Charlehによる素晴らしいアイデア:
public interface IEngineAction
{
void Do(Player target);
}
public class EngineActionMove : IEngineAction
{
public int XDelta;
public int XDelta;
public void Do(Player target)
{
// Example
target.Position = ...
}
}
public class EngineActionDisappear : IEngineAction
{
public void Do(Player target)
{
// Example
target.Visible = false;
}
}
...
リストの例に追加:
var actionsToDo = new List<IEngineAction>();
actionsToDo.Add(new EngineActionDisappear());
actionsToDo.Add(new EngineActionMove { XDelta = 10, YDelta = 20 });
そして反復:
foreach (IEngineAction action in actionsToDo)
{
action.Do(player);
}