SFML 2.0中的键盘事件

6

我正在尝试在SFML 2中获取按键输入,在使用SFML 1.6时我使用的是

   while (App.GetEvent(Event))
       {
          if (App.GetInput().IsKeyDown(sf::Key::Down)) { dir='d'; }
    }

但我不知道如何在SFML 2中实现这一点。


文档包含您可能需要的所有信息:http://sfml-dev.org/documentation/2.0/ - Guilherme Bernal
准确地说,将http://sfml-dev.org/documentation/2.0/classsf_1_1Event.php翻译成中文。 - elimirks
1个回答

19

当您不需要担心实时键盘输入时,可以使用与您提供的SFML 1.6代码非常相似的方法。 在应用程序的事件处理循环中,您可以这样做:

sf::Event event;
while (mWindow.pollEvent(event))
{
    if (event.type == sf::Event::KeyPressed)
    {
        if (event.key.code == sf::Keyboard::Escape)
        {
            // Do something when Escape is pressed...
        }
        if (event.key.code == sf::Keyboard::W)
        {
            // Do something when W is pressed...
        }

        // And so on.
    }
}
这种输入处理方式非常适用于确保用户按下键时应用程序获得焦点的情况,否则将不会生成键事件。当所需按键不经常按下时,这也是一个很好的选择。你可以在这里查看SFML 2.0教程的示例,在标题为“KeyPressed和KeyReleased事件”的部分:http://sfml-dev.org/tutorials/2.0/window-events.php 另一方面,您可能需要实时访问键盘输入。为了做到这一点,请使用SFML 2.0的Keyboard类,像这样:
if (sf::Keyboard::isKeyPressed(sf::Keyboard::W))
{
    // 'W' is currently pressed, do something...
}

使用实时输入,您可以访问在特定时间点输入设备的状态。这很方便,因为您不必将所有关键字检查都放在事件处理循环中。但是,这种方法的缺点是,由于SFML只读取键盘的状态,如果应用程序没有焦点、被最小化等情况下,您的事件处理代码仍可能执行。您可以在此处找到有关所有实时输入的教程:http://sfml-dev.org/tutorials/2.0/window-inputs.php

在选择事件处理与实时处理方法时要小心。例如,在游戏示例中,考虑一种情况,其中角色在用户按住空格键时开火机枪。如果您在事件处理循环中处理空格键,则机枪将错误地像半自动武器一样开火,因为即使用户按住该键,sf::Event::KeyPressed事件之间也会存在延迟。如果您通过实时键盘输入进行空格键处理,则机枪将重复地开火,如预期。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接