在我的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等等......但是,有更好的方法来做这个事件列表吗?
答案 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);