Events 重复关键事件阻塞

Events 重复关键事件阻塞,events,key,blocking,sfml,Events,Key,Blocking,Sfml,我用SFML和OpenGL编写了一个简单的程序,它绘制了一个旋转的正方形,可以用箭头键在屏幕上移动 它在我测试过的所有Linux和Mac计算机上都能正常工作,但当我尝试在Windows上移动正方形时(通过按住箭头键),它会移动一小段距离,然后停止移动和旋转。我很确定程序被困在了GetEvent方法中——我的猜测是,当我按住键足够长的时间使其开始重复时,事件堆栈会在我弹出所有内容之前不断向其添加新事件(如果我把Windows上的按键重复率降到最低,那么问题就消失了——不过我真的不喜欢这个解决方案)

我用SFMLOpenGL编写了一个简单的程序,它绘制了一个旋转的正方形,可以用箭头键在屏幕上移动

它在我测试过的所有Linux和Mac计算机上都能正常工作,但当我尝试在Windows上移动正方形时(通过按住箭头键),它会移动一小段距离,然后停止移动和旋转。我很确定程序被困在了
GetEvent
方法中——我的猜测是,当我按住键足够长的时间使其开始重复时,事件堆栈会在我弹出所有内容之前不断向其添加新事件(如果我把Windows上的按键重复率降到最低,那么问题就消失了——不过我真的不喜欢这个解决方案)

我发现按住Alt、Ctrl、Delete、Page up、Page down、Home、End等键都会导致这种行为(尽管我没有在程序中特别检测到任何这些键),但所有字母键以及空格键、回车键、退格键和键盘箭头键都可以正常工作(即,如果我按住它们太长时间,它们不会导致程序暂停)

我没有确切的代码(我刚关掉了笔记本电脑),但它看起来像:

while(running) {
    while(app.GetEvent(event))
        if(event.Type==sf::Event::Closed) running=false;
    if(input.IsKeyDown(sf::Key::Right)); // move right
    // etc etc
    // update rotation
    // draw everything
}

关于具体问题可能是什么,以及我如何解决它,有什么想法吗?

我知道这是一个老问题,但我想回答这个问题是为了帮助那些可能在这里遇到类似问题的人

SFML 1.6有两种方法可以从用户处获取输入。一种是基于事件的,您可以处理通过
sf::Window::GetEvent()
发送给您的每个事件。另一种是基于查询的,您可以直接检查窗口的
sf::input

您在这里使用了基于查询的方法,但将其放在事件循环中,这并不是它真正打算使用的方式。它本打算这样使用。这是一个很好的功能,因为SFML本质上为您自动保留一个布尔键表,所以您不需要自己管理键状态。IMHO用于使用重复输入is更优雅,因为您不会滥发事件队列,只需检查布尔值

while(app.GetEvent(event))
    if(event.Type == sf::Event::Closed) running=false;
    if(event.Type == sf::Event::KeyPressed && event.Key.Code == sf::Key::Right)
    {
      // move right
    }
}
如果只想直接查询sf::Input,那么可以使用与上面相同的代码,但要将其放在事件循环之外

while(app.GetEvent(event)
{
}

if (myWindow.GetInput().IsKeyDown(sf::Key::Right))
{
}
默认情况下,应为sf::Windows启用自动按键重复,但您可以通过使用
sf::Window::EnableKeyRepeat(true)
确保。这意味着在按住按键时,它将反复发送
按键按下事件


尝试在主事件循环之外使用基于查询的方法,看看这是否对您有效。

您是否尝试过将keystate存储在布尔值中,然后根据布尔值状态进行逻辑处理?因此….如果(input.IsKeyDown(sf::Key::Right))Right=true;…如果(Right)moveRight();到此结束,
sf::Window::EnableKeyRepeat(true)
刚刚回答了我的问题。谢谢您提供的详细信息。