2014-01-17 63 views
0

我遇到了使用函數getch()重複鍵檢查的問題。用getch()重複鍵檢查的問題

這裏是一個代碼示例:

static char g_keybuffer[256]; 
_Bool IsKeyDown(char c) 
{ 
    char ch; 
    if(kbhit()) 
     ch = getch(); 

    if(ch == -32 || ch == 224) 
    { 
     ch = getch(); 
    } 

    g_keybuffer[ch] = 1; 
    if(g_keybuffer[c] == 1) 
    { 
     g_keybuffer[c] = 0; 
     return 1; 
    } 

    return 0; 
} 

/* 
* 
*/ 
int main(int argc, char** argv) { 
    while(1) 
    { 
     if(IsKeyDown('a')) 
     { 
      printf("Test\n"); 
     } 
     if(IsKeyDown('a')) 
     { 
      printf("Hello\n"); 
     } 
     else if(IsKeyDown('b')) 
     { 
      printf("World\n"); 
     } 
     Sleep(100); 
    } 
    return (EXIT_SUCCESS); 
} 

我知道爲什麼會出現這個問題。當按下一個鍵時,每循環kbhit爲真,並將ch設置爲從緩衝區檢索到的字符。當使用IsKeyDown時,如果它等於該參數,則緩衝器g_keybuffer中的密鑰被設置爲等於零以避免使密鑰無限「下降」。這個問題是,如果你想檢查同一個鍵是否關閉多次,只有第一個IsKeyDown實例會被運行,其餘的都是無效的,因爲鍵的g_keybuffer現在爲0.

有誰知道我可以如何更改IsKeyDown以使其能夠在每次循環中多次檢查相同的密鑰?我卡住了。

+0

你嘗試'cin.ignore()'? – theharshest

+1

我沒有仔細查看你的代碼,但是你應該認識到當'kbhit'返回false時'ch'是未初始化的。這將弄亂你的功能 – tay10r

+1

@theharshest這不是'C++' – tay10r

回答

0

您的問題是因爲您在鍵狀態命中後將g_keybuffer[c]設置爲0。我猜你已經這樣做了,以避免兩次獲得相同的結果 - 但這只是一個解決方法。要做正確的事情的唯一方法是選擇一個實際用於捕獲鍵盤狀態的庫。

大多數圖形庫都具有捕獲鍵盤狀態的功能。如果你只是寫一個小程序,我不知道任何解決方案都不會帶來一點額外的開銷。