0

我目前正在使用 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;
    }
4

1 回答 1

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;
}

还要检查文档

于 2012-05-09T01:10:44.833 回答