如何获得自SFML中按下键以来经过的时间

How do I get time elapsed since key pressed in SFML?

本文关键字:经过 时间 何获得 SFML      更新时间:2023-10-16

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

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

这样的函数存在吗?如果没有,我该如何写一个,也许使用sf::Clock功能?

您只需要监听按键事件(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::KeyCount sf::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了。

SFML有提供getElapsedTime()方法的sf::Clock。它返回一个sf::Time对象,您可以在该对象上调用asMiliseconds()以将时间转换为毫秒。