0

私の 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 など、各アクションにイベントを設定できることはわかっていますが、イベントのリストのようにこれを行うより良い方法はありますか?

4

1 に答える 1

0

インターフェイスを使用して処理できます。たとえば、次のようになります。

interface IExecuteAction
{
void doMoveLeftAction();
void doMoveRightAction(); 
}

ExecuteMoveLeftAction(Actions action,IExecuteAction execAction)
{
switch(action
 case Actions.MoveLeft :
        execAction.doMoveLeftAction(); 
        break; 
case Actions.MoveLeft :
        execAction.doMoveLeftAction(); 
        break;
}

コードで、サブスクライバーにこのインターフェイスを実装します

class subscriber1:IExecuteAction
{
void doMoveLeftAction()
{
//do what you want
}
void doMoveRightAction()
 {
 //do what you want
 }
}

そして、次のように処理した後:

ExecuteMoveLeftAction(action,subscriber1);
于 2012-08-12T01:25:23.707 に答える