SDL_KEYDOWN和键识别无法正常工作

时间:2014-10-30 22:05:43

标签: c++ input sdl

在我的项目中,我无法获得一个简单的switch语句来处理SDL输入。这是一个例子:

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代码)。

1 个答案:

答案 0 :(得分: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一起使用。