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的,等等......但是,有沒有更好的辦法做到這一點像事件的列表?
謝謝您提出這種方式!我已經在使用事件來保持訂戶的方法是私人的方面做了太多的設置,但至少在一個接口中,這些方法僅在必要時被調用。無論如何,我不認爲如果沒有設置一個事件+一種方法來觸發這個事件,我想避免的每個動作都是不可能的。 – 2012-08-12 05:09:29