2014-10-30 42 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