如何在SFML中按下键后经过一段时间?

时间:2014-08-22 17:13:28

标签: c++ keypress clock sfml

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

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

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

2 个答案:

答案 0 :(得分: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::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很长一段时间。

答案 1 :(得分:0)

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