首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >键盘事件SFML 2.0

键盘事件SFML 2.0
EN

Stack Overflow用户
提问于 2012-05-22 07:16:14
回答 1查看 9.7K关注 0票数 6

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

代码语言:javascript
复制
   while (App.GetEvent(Event))
       {
          if (App.GetInput().IsKeyDown(sf::Key::Down)) { dir='d'; }
    }

但我不知道如何在SFML 2中做到这一点。

EN

回答 1

Stack Overflow用户

发布于 2012-08-09 11:29:27

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

代码语言:javascript
复制
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.
    }
}

当您必须确保您的应用程序在用户按下键时具有焦点时,这种类型的输入处理是很好的,否则不会生成键事件。当所讨论的键不经常被按下时,它也很好用。您可以从SFML2.0教程中的标题为“KeyPressed和KeyReleased事件”的部分中查看此示例:http://sfml-dev.org/tutorials/2.0/window-events.php

另一方面,您可能实际上需要访问实时键盘输入。为此,请使用SFML 2.0的Keyboard类,如下所示:

代码语言:javascript
复制
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事件之间存在延迟,即使用户按下键也是如此。如果您通过检查实时键盘输入来操作空格键,机枪将重复发射,正如预期的那样。

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10693835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档