2015-08-16 108 views
0

我有一個基於回合的遊戲。在您的輪到時,它會提示您進行移動,並要求您輸入一次按鍵。只要按鍵被檢測到,遊戲就會繼續,直到下一回合纔會提示您。防止GetAsyncKeyState函數在被調用後檢測輸入嗎? C++

雖然使用GetAsyncKeyState函數,但我仍然遇到問題,因爲即使在調用它之後它仍存儲按鍵。

從MSDN網站: 確定某個鍵是否向上或向下的函數被調用,的時間和是否以前調用GetAsyncKeyState後,按下鍵。

粗體區域是我造成的問題,因爲用戶可以在不輪到他/她時輪流鍵入垃圾信息,那麼當輪到他/她時,遊戲會提示用戶並立即確認一個事先按下的輸入。

我對這個功能很類似:

unsigned int getUserInput(){ 

while (true) //Await a user's input 
    { 
      if (GetAsyncKeyState(0x31)) 
      { 
       return 1; //User pressed 1 key 
      } 
      else if (GetAsyncKeyState(0x32)) 
      { 
       return 2; //User pressed 2 key 
      } 
      else if (GetAsyncKeyState(0x33)) 
      { 
       return 3; //User pressed 3 key 
      } 
      else if (GetAsyncKeyState(0x34)) 
      { 
       return 4; //User pressed 4 key 
      } 
      else if (GetAsyncKeyState(0x35)) 
      { 
       return 5; //User pressed 5 key 
      } 
      else if (GetAsyncKeyState(0x36)) 
      { 
       return 6; //User pressed 6 key 
      } 
    } 
} 

我應該不會在這種情況下使用ASNC國家重點?如果是這樣,什麼是更好的選擇?

回答

1

GetAsyncKeyState返回的值是一個位字段。您可以通過按位運算來分離正在查找的位。在你的特定情況下(用於檢測鍵是否被按下),你正在尋找高位。你可以這樣測試:

if (GetAsyncKeyState(0x31) & 0x8000) 
{ 
    return 1; //User pressed 1 key 
} 

但是,如果我正確理解你的問題描述,我不認爲這將完全解決它。聽起來好像你希望用戶在功能運行時不得不按下按鍵(而不是隻能按住按鍵)。你應該爲此做什麼,在功能檢查開始時是否按下了鍵。如果是,等待它被釋放。類似這樣的:

bool key_is_pressed = true; 
while (key_is_pressed) { 
    key_is_pressed = false; 

    // the key codes you are checking are consecutive, 
    // so we can just loop over them 
    for (int key = '1'; key <= '6'; ++key) { 
     if (GetAsyncKeyState(key) & 0x8000)) 
      key_is_pressed = true; 
    } 
} 

然後繼續到等待按鍵的部分。

請注意,您突出顯示的文本「以及在先前調用GetAsyncKeyState」「後是否按下了鍵,實際上可能是解決您的問題的方法。該信息存儲在不同位(低位)中,因此您可以將其隔離並確保以前按下的密鑰不是。不幸的是,MSDN清楚地表明不應該依賴這種行爲。所以當你使用GetAsyncKeyState時,你應該幾乎總是忽略一切。

+0

哇......這讓我感覺有點過頭了。幾個問題:在你的第一個代碼塊中,0x8000是什麼意思,爲什麼需要那裏?在我所有的GetAsyncKeyState調用中,它只是GetAsyncKeyState(參數)調用。 – Hatefiend

+0

@Hatefiend:'0x8000'是一個十六進制數字,它的二進制表示形式是'1000000000000000'。通過將(使用'&')與對'GetAsyncKeystate'的調用結果相結合,您可以屏蔽除最重要位以外的所有內容。其結果是,如果該位爲0,則組合的結果爲0(在if語句中將其作爲「false」),如果該位爲「1」,則結果爲非零在if語句中比較爲'true')。 –

+0

我也應該對我的問題進行更具描述性的描述。有時我會要求用戶按下字母鍵和數字鍵,空格鍵等,因此您創建的for循環可能無法工作。真的看完循環之後..它告訴計算機......「好吧,用戶按下了按鍵1?按鍵2還是按鍵3?等等。」我不明白這是如何改進的:if(key1 pressed)else if(key2 pressed)等等。我不明白它是如何解決我的問題,即使在函數調用之後,AsycKey仍然監聽按鍵已經制成。 – Hatefiend

相關問題