【问题标题】:Keyboard Event SFML 2.0键盘事件 SFML 2.0
【发布时间】:2012-05-28 11:02:46
【问题描述】:

我试图在 SFML 2 中获取密钥输入,在 SFML 1.6 中使用

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

但我不知道如何在 SFML 2 中执行此操作。

【问题讨论】:

标签: sfml


【解决方案1】:

当您不需要担心实时键盘输入时,您可以使用与您提供的 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 的键盘类:

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 事件之间存在延迟,即使用户按住该键也是如此。如果您通过检查实时键盘输入来处理空格键,机枪将按预期重复射击。

【讨论】:

    猜你喜欢
    • 2019-03-01
    • 2010-10-15
    • 2012-12-27
    • 2013-07-27
    • 1970-01-01
    • 2022-01-22
    • 2018-02-13
    相关资源
    最近更新 更多