2008-10-28 121 views
1

我會盡我所能地解釋我的場景;將輸入傳遞給狀態機(c#)

在每個應用程序刻度我查詢鍵盤和鼠標的當前狀態,並將它們包裝在單獨的類和數據結構中。對於鍵盤,它是我的鍵的數組枚舉(每個鍵當前按下的一個項目),對於鼠標來說,它是一個類,其中包含按下的每個按鈕的座標delta和bools。

我也有一個基本的狀態機,通過一個狀態管理器類來管理,該狀態管理器維護堆棧和編組狀態。

我想知道的是,如何最好地將輸入(快照)傳遞給我的應用可以在任何時候處於的狀態?

我想盡可能多地處理遠離各個狀態的輸入,以減少狀態內的重複邏輯。

或者是最好保持輸入快照儘可能純,並將它們傳遞給狀態,以便它們可以保持輸入特定邏輯隱藏?

注意
這種結構類同我如何想象一個遊戲會工作,雖然這個應用程序是不是遊戲它確實需要儘快處理。

回答

2

你爲什麼每次打勾都要查詢鍵盤和鼠標的狀態?一個更好更傳統的解決方案是捕獲鍵盤和鼠標觸發的事件。這樣你只需要在需要時更新狀態。

+0

我目前正在沿着這些方向努力,所以我會盡快給您發佈。 – 2008-10-28 16:11:05

1

在XNA中,他們通過靜態鍵盤類來實現這一點。

KeyboardState state = Keyboard.GetState(); 

然後,您可以通過上面的代碼行訪問當前的按鍵狀態。

0

您應該觸發事件並捕獲參數。這將是處理這個問題的最簡單,最有效的方法。

class YourClass 
{  
    //data members ... 

    public void OnKeyboardPress(object sender, EventArgs args) 
    { 
     //handle your logic capturing the state here 
    } 
} 

//elsewhere 
someControl.KeyPress += new KeyPressDelegate(yourClassInstance.OnKeyboardPress); 
2

如果您只需要查詢您的鍵盤和鼠標的每一個節拍,我可以保證你會碰到的問題。當你查詢每一個滴答時,你會發現你錯過了快速發生的輸入(在單個滴答的時域內)。想象一下,用戶在兩次滴答之間按下並釋放按鍵/按鈕的情況(它會發生得比您想象的要多) - 您將完全錯過輸入。

特別是在C#中,這是完全適合類似這樣的輸入事件,您應該使用事件。