如何检测键何时被释放(SDL 2.0)

How can I detect when a key has been released (SDL 2.0)

本文关键字:释放 SDL 何检测 检测 何时      更新时间:2023-10-16

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

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