【问题标题】:How do I get time elapsed since key pressed in SFML?如何获得自在 SFML 中按下键以来经过的时间?
【发布时间】:2014-08-22 17:13:27
【问题描述】:

所以我正在开发一个使用 SFML 的游戏,我知道有一个函数 isKeyPressed(key),它返回类型 bool

但是我需要一种方法来获取自第一次按下键以来按下的时间,返回一个整数,表示自第一次按下该键以来的毫秒数(如果当前未按下,则为 0)。

这样的功能存在吗?如果不是,我将如何编写一个,也许使用sf::Clock 功能?

【问题讨论】:

  • 您需要什么精度?通常时间会减少约 16 毫秒。

标签: c++ keypress clock sfml


【解决方案1】:

您只需要监听按键事件 (sf::Event::KeyPressed) 并启动某种计时器:将当前时间存储在 sf::Clock 中并使用 getElapsedTime() 检索经过的时间。

这是监听事件的方法:

sf::Event event;
sf::Clock clock;
while (window.pollEvent(event))
{
    if (event.type == sf::Event::KeyPressed) {
        // A key was pressed, start your sf::Clock
        clock.restart();
    }
}
// ...
clock.getElapsedTime();

如果您需要特定于键的时钟,则需要指定是否要像这样对待每个键、多个键还是少数键。

编辑(来自您的评论): 如果你想处理每一个键,你需要一个sf::Keyboard::KeyCountsf::Clock的数组。然后您可以独立地重新启动每个键的时钟。像这样:

sf::Event event;
std::array<sf::Clock, sf::Keyboard::KeyCount> keyClocks;
while (window.pollEvent(event))
{
    if (event.type == sf::Event::KeyPressed) {
        // A key was pressed, start this key sf::Clock
        keyClocks[event.key.code].restart();
    }
}
// ...
keyClocks[sf::Keyboard::A].getElapsedTime();

请注意,如果您访问未按下相应键的键时钟,您可能会得到一些奇怪的未初始化内容,或者可能是自声明 keyClocks 以来的时间。

PS:我个人会使用标准库的时间点和持续时间,因为我没有经常使用 SFML,但它的作用大致相同。另外,我的代码可能有错误,因为我有一段时间没有接触 SFML。

【讨论】:

  • 好的,谢谢。你知道是否有一个简单的方法来处理每个键,比如遍历每个键?
  • 给你。请记住,它是一个大数组(大约 100 个元素),但由于 sf::Clock 是轻量级的,所以它应该不是问题。对于一组自定义键有更好的解决方案(例如,我将创建一个类似于sf::Keyboard::Key 的枚举,使用更少的键)。
  • 非常感谢!现在我需要做的就是确保函数在没有按下键的情况下返回 0,并且我的状态应该很好:)
【解决方案2】:

SFML 有 sf::Clock,它提供了一个 getElapsedTime() 方法。它返回一个sf::Time 对象,您可以调用asMiliseconds() 以将时间转换为毫秒。更多信息herehere

【讨论】:

  • 是的,但是如果您阅读我的问题,我会询问自键盘输入以来经过的时间。
  • 所以,做一些简单的数学运算并从当前时间中减去按键被按下的时间。请大家多多努力
  • @Yaxlat 我告诉你你会用什么来做这件事,但 Nelxost 做对了。检查他的答案。
  • @Bojangles 对不起,如果我的问题措辞不好,但我想知道如何才能做到这一点,以便它适用于任何键,而不仅仅是特定键,我会尝试通过事件来解决,但我需要找到一种方法来遍历 SFML 中的每个键 :)
猜你喜欢
  • 1970-01-01
  • 2011-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多