c++ - SDL 2.0 按键重复和延迟

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

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

最佳答案

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

尝试在事件循环之外使用 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;

关于c++ - SDL 2.0 按键重复和延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29373203/

相关文章:

c++ - 跨平台项目中的 Eigen 错误

javascript - 如何在 Javascript/Sencha 中监听键盘打开/关闭?

c++ - 未知像素格式错误 SDL2

c - 如何在 SDL_Renderer 内移动单个元素?

c++ - SDL2 - 为什么 SDL_CreateTextureFromSurface() 需要渲染器*?

c++ - 将我的 MMX Intrinsics 转换为 x64 (SSE) 我做错了什么?

c++ - 以纹理/纯色绘制透明孔

c++ - Linux : Can a directory rename be partially executed due to a power/transient mechanical failure in Server/Disk?

javascript - 如果用户按 Enter 或单击外部,则保留元素的新 html 值

快速移动文本字段问题