2012-08-12 51 views
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的,等等......但是,有沒有更好的辦法做到這一點像事件的列表?

回答

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); 
+0

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

相關問題