2014-10-30 71 views
0

在我的項目中,我無法獲得簡單的開關語句以用於SDL輸入。這裏是這樣的例子:SDL_KEYDOWN和密鑰識別不正常

SDL_Event event; 

SDL_PollEvent(&event); 


if (event.type == SDL_KEYDOWN) 
{ 

    switch (event.key.keysym.sym) 
    { 
    case SDLK_a: m_x -= 30; 
      break; 
    case SDLK_d: m_x += 30; 
      break; 
    case SDLK_w: m_y -= 30; 
      break; 
    case SDLK_s: m_y += 30; 
      break; 
    } 
} 

當我運行這個,首先看起來SDL_KEYDOWN似乎沒有被識別。我的情況也不是這樣。於是我轉向代碼:

SDL_Event event; 

SDL_PollEvent(&event); 


if (event.type == 771) 
{ 

    switch (event.key.keysym.sym) 
    { 
    case SDLK_a: m_x -= 30; 
      break; 
    case SDLK_d: m_x += 30; 
      break; 
    case SDLK_w: m_y -= 30; 
      break; 
    case SDLK_s: m_y += 30; 
      break; 
    default: m_y += 1; 
    } 
} 

這將導致默認情況下,當我拿着運行或按任意鍵,那麼根據m_y + = 1。我的物體移動。如果我刪除默認的情況下,嘗試按w ,a,s或d,沒有任何反應。如果我保留m_y + = 1,但使用SDL_KEYDOWN而不是771,則不會發生任何事情。 (每當按下某個鍵時,我都通過打印event.type獲得了771代碼)。

+0

你確定你正在#include SDL.h嗎? – Exceptyon 2014-10-31 13:06:50

回答

2

您只需撥打SDL_PollEvent()一次,因此它給出了第一個發生的事件,可能不是SDL_KEYDOWN
你必須做一個main循環來處理你的事件:

SDL_Event event; 
bool quit=false;  
while(!quit) 
{ 
    while(SDL_PollEvent(&event) 
    { 
     if(event.type==SDL_KEYDOWN) 
     { 
      .... 
     } 
     else if(event.type==SDL_QUIT) 
     { 
      quit=true; 
     } 
    } 
} 

這個循環需要你不關心(對例如MOUSEMOTION)事件的照顧。

如果您要處理許多不同類型的事件,還可以使用switchevent.type