SDL 2.0密钥重复和延迟

时间:2015-03-31 16:04:41

标签: c++ keyboard-events sdl-2

我在乒乓球游戏中遇到SDL 2.0键盘输入问题。当我按左箭头命令向左移动时,它由SDL_PollEvents()处理,如果按下键一次,则响应正确。但是,如果我按下按键,我会在连续移动之前得到一个短暂的延迟(只要Windows键重复延迟)。

这是功能处理事件:

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

编辑:毕竟,我设法通过调用解决了这个问题 ProgramParametersInfo(SPI_SETKEYBOARDDELAY,0,0,0)在程序开始时和SystemParametersInfo(SPI_SETKEYBOARDDELAY,1,0,0)结束,返回标准键重复延迟。

4 个答案:

答案 0 :(得分:6)

对于游戏移动,您通常不会使用事件,而是使用状态。

尝试在事件循环之外使用SDL_GetKeyboardState():

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;

答案 1 :(得分:0)

简单就是那个

int vertical = 0;
int horizontal = 0;

float x = 500;
float y = 500;

float speed = 5.0;
在你的sdl循环中

    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;

答案 2 :(得分:0)

使用SPI_SETKEYBOARDDELAY并不是一个好方法。这样,您的游戏将不再可用,因为它仅在Windows上可用。

相反,您应该在SDL_GetKeyboardState之前的答案中使用类似menthiond的东西。

但是请注意,您仍然必须收集SDL_PollEvent。否则SDL_GetKeyboardState将始终为空。

所以应该像这样:

//...
SDL_Event sdlEvent;
while (SDL_PollEvent(&sdlEvent)) {
    if (sdlEvent.type == SDL_QUIT) {
        //..
    }
}

const Uint8* keystates = SDL_GetKeyboardState(NULL);

if(keystates[SDL_SCANCODE_LEFT]) {
    //...
}
if(keystates[SDL_SCANCODE_RIGHT]) {
    /...
}
//...

答案 3 :(得分:-2)

在-while(SDL_PollEvent(&mainEvent))之外使用SDL_GetKeyboardState捕获,效果很好。