私の C#/XNA プロジェクトには、入力を管理する「静的」クラスがあります。次のようになります。
internal sealed class InputManager
{
public delegate void KeyboardHandler(Actions action);
public static event KeyboardHandler KeyPressed;
private static readonly Dictionary<Actions, Keys> KeyBindings = Main.ContentManager.Load<Dictionary<Actions, Keys>>("KeyBindings");
private static KeyboardState currentKeyboardState;
private InputManager()
{
}
public static void GetInput()
{
currentKeyboardState = Keyboard.GetState();
foreach (KeyValuePair<Actions, Keys> actionKeyPair in KeyBindings)
{
if (currentKeyboardState.IsKeyDown(actionKeyPair.Value))
{
OnKeyPressed(actionKeyPair.Key);
}
}
}
private static void OnKeyPressed(Actions action)
{
if (KeyPressed != null)
{
KeyPressed(action);
}
}
}
したがって、ゲーム全体を通して、入力を取得し、辞書に含まれるいずれかのキーが現在押されているかどうかを確認します (キー バインドの目的で辞書を使用します。アクションはキーにバインドされます)。その場合、関連付けられたアクションを引数として KeyPressed イベントが発生します。これにより、外部クラス (カメラなど) をこのイベントにサブスクライブし、アクション (キー) に基づいて適切な処理を実行できます。
問題は、次のようにすべてのサブスクライバーのメソッドでアクションをテストする必要があることです。
if (action == Actions.MoveLeft)
{
DoSomething();
}
したがって、どのキーが押されても (ディクショナリの一部である限り)、実際には必要がない場合でも、すべてのサブスクライバーのメソッドが呼び出されます。
イベント MoveLeft、イベント MoveRight など、各アクションにイベントを設定できることはわかっていますが、イベントのリストのようにこれを行うより良い方法はありますか?