2013-02-21 21 views
1

所以,我在C編碼一個choplifter和我的問題是: 我怎樣才能管理與SDL同時按下兩個鍵? 我嘗試了兩個開關,但沒有什麼可做的,它不會工作:/2鍵在同一時間SDL CodeBlocks

SDL可以這麼做嗎?

+3

請發佈您的代碼。 – 2013-02-21 12:51:05

+0

確保你的鍵盤[不吸吮](http://www.sjbaker.org/wiki/index.php?title=Keyboards_Are_Evil)。 – genpfault 2013-02-22 18:52:13

回答

0

當我這樣做,我個人喜歡用SDL_GetKeyState檢查使用類似於下面的代碼的東西手動鍵盤上的每個按鍵:

int *keystates; 

keystates = SDL_GetKeyState(NULL); 
if (keystates[SDLK_a]) { 
    a_key_pressed = true; 
} else { 
    a_key_pressed = false; 
} 
if (keystates[SDLK_b]) { 
    b_key_pressed = true; 
} else { 
    b_key_pressed = false; 
} 

所有的鍵名的SDL的完整列表是avaliable在http://www.libsdl.org/docs/html/sdlkey.html#AEN4720

最好你能做出這樣成功能可輕鬆查看任意鍵是這樣的:(沒有測試,但是概念是正確的)

BOOL CheckKey(int keyname) { 
    int *keystates = SDL_GetKeyState(NULL); 
    if (keystates[keyname]) { 
     return TRUE; 
    } 
    return FALSE; 
} 
1

一個例子: 如果你是,說想讀如果兩個'a''b'同時被按下時,你可以運行一個循環來檢查活動如常,並有一個名爲a_true布爾值和b_true,並在檢查循環結束,如果兩者都是真的。你可以按一下鍵來檢查它們是否真實,並且還可以發佈一個檢查鍵以使它們爲假。沒有代碼我不認爲任何人都可以給出更具描述性的答案。

0

如果您要執行的操作是支持按CTRL和另一個按鈕(例如CTRL + A),則可以使用unicode。優點是使用簡單,並且與AZERTY鍵盤兼容。所以如果你想這樣做能夠支持CTRL +的東西,我推薦使用這個。但是,對於任何其他用途,它不起作用,因此請使用其他答案之一。這是關於如何使用它的一個例子:

switch(event.type){ 
    case SDL_KEYDOWN: 
     SDL_EnableUNICODE(1); 
     switch(event.key.keysym.unicode){ 
      case 1: //CTRL+A 
       //code 
       break; 
      case 97: //A 
       //code 
       break; 
     } 
} 

要獲取代碼鍵,每個鍵組合,確保沒有在你的代碼中的任何SDL_EnableKeyRepeat後寫在你的程序代碼(或有是,在它的前面插入暫時//,否則你會得到相同的代碼的重複長):

fprintf(stderr,"%d",event.key.keysym.unicode); 

和有問題的組合的代碼是在同一文件夾中的文件的stderr.txt爲可執行文件。