c++ - 如何检测何时释放 key (SDL 2.0)

标签 c++ sdl

我在检测何时释放 key 时遇到问题。如果我要打电话:

csdl_setup->GetMainEvent()->key.keysym.sym == SDLK_UP

SDLK_UP 在大约 2-3 秒内不成立,这对于键盘驱动的菜单来说效率很低。我希望能够在 SDL 中轻松滚动菜单。

谁能帮帮我?

SDL_Event event;
while (SDL_PollEvent(&event) && event.key.repeat == 0 && some_sprite->GetY() == coords[1] && event.type == SDL_KEYDOWN)
{
    some_sprite->SetY(coords[1] + 20);
}

SDL_PollEvent(&event);
if (event.key.repeat == 0 && some_sprite->GetY() == coords[3])
{

    if(some_sprite->GetY() == coords[3] && event.type == SDL_KEYDOWN)
    {
        some_sprite->SetY(coords[3] + 20);
    }
    cout << "Event Key Repeat = " << event.key.repeat << endl;

}

最佳答案

您应该在事件发生时对其进行处理。您的代码多次调用 SDL_PollEvent(),甚至在某些情况下会短路轮询。

将所有事件处理代码移到 while 循环中。删除对 while 循环的额外检查,以便您留在循环中,直到处理完所有事件。

快速修改您的代码可能如下所示:

SDL_Event event;
while (SDL_PollEvent(&event))
{
    if(event.type == SDL_KEYDOWN)
    {
        if(event.key.repeat == 0)
        {
            if(some_sprite->GetY() == coords[1])
                some_sprite->SetY(coords[1] + 20);
            else if(some_sprite->GetY() == coords[3])
                some_sprite->SetY(coords[3] + 20);
        }
        cout << "Event Key Repeat = " << event.key.repeat << endl;
    }
}

关于c++ - 如何检测何时释放 key (SDL 2.0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24235959/

相关文章:

opengl - 当窗口大小调整时,如何使 SDL 窗口中的 OpenGL 视口(viewport)保持静止?

c++ - SDL2有内存泄漏吗?

c++ - 使用模板函数安全地在多个类类型之间进行转换

c++ - return 语句是否为按值返回的函数创建一个临时对象?

python - C++ 中的数组内数组类似于 python 中的列表中的列表

c++ - 矩阵运算,构造函数问题

c++ - OpenGL:没有绘制

c++ - 在类和构造函数中使用 vector 时出现段错误

c++ - 条件为真时播放声音

python - 看来我有一个 rpath 问题在 OSX El Capitan 10.11 上安装 pygame