SDL_PollEvent没有接所有事件

SDL_PollEvent not picking up all events

本文关键字:事件 PollEvent SDL      更新时间:2023-10-16

我目前正在使用 SDL 制作游戏,但遇到了 SDL 无法接收某些事件的问题。对于示例,我将按"w"向前移动,同时,我正在移动鼠标环顾四周。但是,假设我按"a"或"d",SDL 不会选择这些事件,或者即使我释放"w",SDL 也不会选择这些事件。我首先在 Windows 中编写了这段代码,一切正常,但在切换到 ubuntu 后,它不再按预期工作。这是我轮询事件的主要循环:

while(Running)
{
    while(SDL_PollEvent(&event))
        Events(&event);
    if( active ){
        Loop();
        Render();
    }
}

这是 Events() 中的代码:

switch(Event->type)
    {
        case SDL_QUIT:
            Running = false;
            break;
        case SDL_KEYDOWN:
            switch(Event->key.keysym.sym)
            {
                case SDLK_ESCAPE:
                    Running = false;
                    break;
                case SDLK_a:
                    keyStates['a'] = true;
                    break;
                case SDLK_s:
                    keyStates['s'] = true;
                    break;
                case SDLK_d:
                    keyStates['d'] = true;
                    break;
                case SDLK_w:
                    keyStates['w'] = true;
                    break;
                case SDLK_LSHIFT:
                    camera.setSpeed(2.0f);
                    break;
            }
            break;
        case SDL_KEYUP:
            switch(Event->key.keysym.sym)
            {
                case SDLK_a:
                    keyStates['a'] = false;
                    break;
                case SDLK_s:
                    keyStates['s'] = false;
                    break;
                case SDLK_d:
                    keyStates['d'] = false;
                    break;
                case SDLK_w:
                    keyStates['w'] = false;
                    break;
                case SDLK_LSHIFT:
                    camera.setSpeed(1.0f);
                    break;
            }
            break;
        case SDL_MOUSEBUTTONDOWN:
            switch(Event->button.button)
            {
                case SDL_BUTTON_MIDDLE:
                    mouse.middle = true;
                    break;
            }
            break;
        case SDL_MOUSEBUTTONUP:
            switch(Event->button.button)
            {
                case SDL_BUTTON_MIDDLE:
                    mouse.middle = false;
                    break;
            }
            break;
        case SDL_MOUSEMOTION:
            if( moving ){
                camera.lookat(float(Event->motion.x - winWidth/2),float(Event->motion.y - winHeight/2), MOUSE_SENSITIVITY, dt);
                SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE);
                SDL_WarpMouse(winWidth/2, winHeight/2);
                SDL_EventState(SDL_MOUSEMOTION, SDL_ENABLE);
            }
            break;
    }

键状态['a'] = 真;

这是有SDL_GetKeyState的。使用它而不是手动维护阵列。

Uint8 keys[SDLK_LAST];
Uint8* sdlKeys = SDL_GetKeyState(0);
memcpy(keys, sdlKeys, sizeof(keys));

.

bool keyPressed(SDLKey key){
    return keys[key] == SDL_PRESSED;
}

另请查看文档。