2013-07-10 43 views
2

有誰知道如何讓SDL_GetKeyState正常工作,而無需設置輪詢SDL事件的循環?SDL在沒有使用事件的情況下獲取鍵盤狀態

int *keystates; 
keystates = SDL_GetKeyState(NULL); 
SDL_PumpEvents(); 
std::cout << "Test 1\n"; 
if (keystates[SDLK_F1]) { 
    std::cout << "Test 1 Okay\n"; 
    key_ac = true; 
    emu->setPower(true); 
} 

此代碼運行第二個100次以上,但即使我按住F1鍵,我還沒有得到任何輸出說它是成功的。

我沒有SDL事件循環,所以這可能是因爲我沒有使用它們而丟棄事件?在這種情況下,我如何才能讓SDL過濾掉所有事件?

+0

什麼是您的具體問題?如何製作一件作品太寬泛。 – 2013-07-10 20:41:52

+0

如何使SDL_GetKeyState正常工作,而無需設置輪詢SDL事件的循環?對不起,我應該更清楚一點 – Scott

+0

按照文檔中的規定使用它,而不是使用事件循環。 – 2013-07-10 20:48:50

回答

4

SDL_GetKeyState()只需在程序開始時調用一次。

unsigned char * keys = SDL_GetKeyState(NULL); 

然後它返回的值,一個無符號字符指針指向一個數組被存儲在內部。要更新數組的狀態,請調用功能SDL_PumpEvents()

要在主循環更新數組keys

SDL_PumpEvents(); 

if(keys[ SDLK_m ]) 
{ 
    //do stuff 
} 

編輯: 您可以撥打SDL_GetKeyState(),就像你第一次調用後想,你會不會創建一個內存泄漏。該函數總是返回相同的指針。

+0

這對我自己很好。我發現我的問題是由於我一起使用GTK和SDL,似乎SDL在與GTK一起使用時不能正確處理事件。不過,將這個解決方案標記爲正確的,正如在正常情況下這是正確的答案。 對我來說,我認爲我將不得不尋找一種讓gtk處理鍵盤輸入或將它們傳遞給sdl的方法。但那是一個完全不同的問題。 – Scott

相關問題