【问题标题】:SDL_PollEvent not picking up all eventsSDL_PollEvent 未获取所有事件
【发布时间】:2015-03-02 02:48:49
【问题描述】:

我目前正在使用 SDL 制作游戏,但遇到了 SDL 无法获取某些事件的问题。例如,我将按下“w”向前移动,同时移动鼠标环顾四周。但是假设我然后按“a”或“d”,SDL 不会选择这些事件,甚至当我释放“w”时,SDL 也不会选择 KEYUP 事件。我首先在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;
    }

【问题讨论】:

    标签: c++ sdl


    【解决方案1】:

    keyStates['a'] = true;

    这里有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;
    }
    

    同时检查documentation

    【讨论】:

    • -1:指向首页的链接并不能真正引导 OP 在没有不必要信息的情况下解决问题。当然这会让他们阅读并最终找到答案,但还有一大堆额外内容无助于解决问题。
    • @user2738698:老兄。检查问题和答案的日期。
    • 所以?它也不会帮助未来的人。大多数答案都很好,首页的链接不会帮助任何想要解决问题的人。
    • 嗯,适合自己。不过,您不妨继续写下自己的答案。
    猜你喜欢
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    • 2022-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多