SDL 2.0 Key repeat and delay

99封情书 提交于 2020-01-21 12:17:11

问题


I'm having a problem with SDL 2.0 keyboard input in pong-like game. When I order to move to the left by pressing left arrow, it is processed by SDL_PollEvents() and responds correctly if the key was pressed once. However, if I keep the key pressed, I get a short delay (as long as Windows key repeat delay) before moving continuously.

Here is function processing events:

void Event::PlayerEvent (Player &player)
{
    while (SDL_PollEvent (&mainEvent))
    {
        switch (mainEvent.type)
        {
            case SDL_KEYDOWN :
                switch (mainEvent.key.keysym.sym)
                {
                    case SDLK_ESCAPE :
                        gameRunning = false;
                        break;
                    case SDLK_LEFT :
                        player.moving = player.left;
                        break;
                    case SDLK_RIGHT :
                        player.moving = player.right;
                }
                break;
            case SDL_QUIT :
                gameRunning = false;
        }
    }
}

EDIT: After all, I managed to fix this issue by calling SystemParametersInfo (SPI_SETKEYBOARDDELAY, 0, 0, 0) at the start of the program and SystemParametersInfo (SPI_SETKEYBOARDDELAY, 1, 0, 0) at the end, to return to standard key repeat delay.


回答1:


For game movement, you would typically not use events, but rather use states.

Try using SDL_GetKeyboardState() outside of the event loop:

const Uint8* keystates = SDL_GetKeyboardState(NULL);

...

if(keystates[SDL_SCANCODE_LEFT])
    player.moving = player.left;
else if(keystates[SDL_SCANCODE_RIGHT])
    player.moving = player.right;



回答2:


simple as that

int vertical = 0;
int horizontal = 0;

float x = 500;
float y = 500;

float speed = 5.0;

in your sdl loop:

    if (SDL_PollEvent(&event))
    {
        switch (event.type)
        {
            case SDL_KEYDOWN:
            {
                switch (event.key.keysym.sym)
                {
                    case SDLK_LEFT:  horizontal=-1; break;
                    case SDLK_RIGHT: horizontal = 1; break;
                    case SDLK_UP:    vertical=-1; break;
                    case SDLK_DOWN:  vertical=+1; break;
                }
                break;
            }
            case SDL_KEYUP:
            {
                switch (event.key.keysym.sym)
                {
                case SDLK_LEFT:  horizontal = 0; break;
                case SDLK_RIGHT: horizontal = 0; break;
                case SDLK_UP:    vertical = 0; break;
                case SDLK_DOWN:  vertical = 0; break;
                }
                break;
            }
        }
    }
    x += horizontal * speed;
    y += vertical * speed;



回答3:


Use the SDL_GetKeyboardState capturing outside of - while (SDL_PollEvent (&mainEvent)), that works fine.



来源:https://stackoverflow.com/questions/29373203/sdl-2-0-key-repeat-and-delay

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!