有效地处理多个“类似”事件

时间:2012-08-12 00:43:07

标签: c# events xna-4.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等等......但是,有更好的方法来做这个事件列表吗?

1 个答案:

答案 0 :(得分: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);