.NET を使用してビデオゲームを開発していますが、コマンドのキューイングを適切に実装して一度に実行する方法に苦労しています。
私のビデオゲームはシンプルで、動く飛行機です。コマンド パターンの私の実装は次のとおりです。次に、これらのコマンドの管理を Player クラスに実装します。
public abstract class ICommand {
Category CategoryProperty { get; set; }
public abstract void Execute();
}
public class MoveAircraftCommand : ICommand
{
private Vector2f _velocity;
Aircraft aircraft;
public Category CategoryProperty {
get {
return Category.PlayerAircraft;
}
}
public MoveAircraftCommand (float vx, float vy, Aircraft v_aircraft) {
_velocity = new Vector2f(vx, vy);
aircraft = v_aircraft;
}
public override void Execute()
{
aircraft.Accelerate(_velocity);
}
}
//Then, There is the Player class that binds keys to actions, and actions to Commands.
public class Player
{
public enum ActionMove {
MoveLeft,
MoveRight,
MoveUp,
MoveDown,
ActionCount
}
private IDictionary<Keyboard.Key, ActionMove> _keyBinding;
private IDictionary<ActionMove,ICommand> _actionBinding;
public Player()
{
_keyBinding = new Dictionary<Keyboard.Key, ActionMove>();
_keyBinding.Add(Keyboard.Key.Left,ActionMove.MoveLeft);
_keyBinding.Add(Keyboard.Key.Right,ActionMove.MoveRight);
_keyBinding.Add(Keyboard.Key.Up,ActionMove.MoveUp);
_keyBinding.Add(Keyboard.Key.Down,ActionMove.MoveDown);
/** Dunno how to bind the actions to commands without instantiating the command, Hard-Coding the parameters at start. Also Yet I don't have instantiated the aircraft object**/
float playerSpeed = 200f;
_actionBinding.Add(ActionMove.MoveRight,new MoveAircraftCommand(+playerSpeed,0f,aircraft));
_actionBinding.Add(ActionMove.MoveUp,new MoveAircraftCommand(0f,-playerSpeed, aircraft));
_actionBinding.Add(ActionMove.MoveDown,new MoveAircraftCommand(0f,+playerSpeed,aircraft));
/** **/
/**This function pushes the Commands to a queue, in order to process them in order at once**/
public void HandleRealTimeInput(CommandQueue commands) {
foreach (KeyValuePair<Keyboard.Key,ActionMove> entry in _keyBinding) {
if (Keyboard.IsKeyPressed(entry.Key) && isRealTimeAction(entry.Value)) {
commands.Push(_factory.GetCommand(_keyBinding[entry.Key]));
}
}
}
コマンド パターンを適切に実装し、これらのコマンドが必要なときにすべてのパラメーターを使用して適切にインスタンス化するにはどうすればよいですか?
ありがとうございました