2014-01-22 22 views
0

我目前正在通過getch()while循環聽取鍵盤輸入,並且所有工作都很好。但是,如果我按住左側並向上按,則左側移動將停止,直到再次按下它爲止。我能想到解決這個問題的唯一方法就是要知道一個鍵是否被保留/何時被釋放。我使用的ncurses據說有這個能力,但通過我所有的搜索我沒有發現任何有用的東西。C++差異化按鍵與鍵釋放

俄羅斯方塊代碼段在問:

int ch = getch(); 
while(ch != 'x') { 
    // Handle arrow keys first 
    if (ch == '\033') { 
     getch(); // Get rid of slash 
     switch (getch()) { 
     case 'A': rotate(); redraw(); break; // Up 
     case 'B': move(DOWN); redraw(); break; // Down 
     case 'C': move(RIGHT); redraw(); break; // Right 
     case 'D': move(LEFT); redraw(); break; // Left 
     } 
    } else { 
     switch(ch) { 
     // Stuff not relevant to this question 
     } 
    } 
    ch = getch(); 
} 

回答

0

這個問題比你想象的更復雜。這就是所謂的鍵盤重影。爲了確保同時按下多個按鍵,您可能需要使用專用鍵盤來提供防重影功能,或者您可能必須按照本文重新映射鍵盤。 Read it here瞭解更多詳細信息。

+0

你確定他面臨這個問題嗎?我認爲他問的是keyListener –

+1

是的,我很確定,問題是按鍵信號沒有到達硬件。前幾天我有類似的問題,我在SDL上工作,我做了一個RPG遊戲,我必須在8個方向上移動我的角色。頂部+左邊,頂部+右邊,底部+左邊,底部+右邊等問題是,當頂部按鍵被按下,並且稍後按下左鍵時。角色停止移動頂部。我確定SDL_EnableKeyRepeat()已打開,問題仍然存在。所以我讀了這篇文章,並改變了控制。現在它工作正常。這是一個硬件問題。相當可以理解。 – kotAPI

+0

@OMerObaid,也不是keyListener一個java的東西?我認爲這是一個C++問題。 – kotAPI

0

解決方案必須在Linux下工作?

+0

Linux中有沒有STDLIB殘培()函數,你需要使用水木清華這樣'#包括 的#include 的#include INT mygetch(){ 結構termios的oldt, 蠑螈; int ch; tcgetattr(STDIN_FILENO,&oldt); newt = oldt; newt.c_lflag&=〜(ICANON | ECHO); tcsetattr(STDIN_FILENO,TCSANOW,&newt); ch = getchar(); tcsetattr(STDIN_FILENO,TCSANOW,&oldt); return ch; }' –