如果用户想要知道在SFML中使用事件轮询循环按下某个键的“精确”时间,一种可能的方法是查询与每个sf::Event
捆绑在一起的时间戳数据。
但是我没有在文档中找到任何建议在sf::Event
类中存在此类数据的内容。
问题1:此数据是否存在于sf::Event
中。我有一个模糊的回忆,它可能在早期版本的sfml或其他窗口工具包中做过吗?
问题2:如果没有,则可以准确测量按键的持续时间吗?
问题3:是否有其他窗口工具包可以实现此目的?
目前我正在做以下事情:
double time_pressed = 0.0;
sf::Clock clock;
clock.restart();
while(window.isOpen())
{
// Timing control
const double delay_time = 1.0 / 100.0;
double current_delay_time = clock.restart().asSeconds();
if(current_delay_time < delay_time)
{
sf::sleep(sf::seconds(delay_time - current_delay_time));
}
sf::Event event;
while(window.pollEvent(event))
{
if(sf::Keyboard::isKeyPressed(sf::Keyboard::A))
{
time_pressed += current_delay_time; // !
}
}
// Other code
window.display();
}
有更好或更好的方法吗?
我知道这可能取决于操作系统,考虑到Linux不是RTOS,我相信Windows是? (?)在他们管理多个任务的意义上,两者都是“操作系统”,因此大概是“最准确的理论上可行的方法”从操作系统本身记录了按键的时间戳?如果数据存在,可以访问该数据吗?
我使用Linux,但这实际上是针对Windows项目的 - 我对此几乎一无所知。
答案 0 :(得分:0)
此解决方案需要为您要测量的每个键实例化sf :: Clock,因为在您已经测量另一个键时可以按下键。因此,这里假设您只想测量特定键的时间。否则,你可以实现一个系统,每次按下一个新按键时按下一个容器中的sf :: Clock,而另一个按下了另一个按键,并在使用后从容器中删除该时钟。你需要以某种方式将时钟的位置保存在容器中。
以下是密钥K的解决方案,任意:
sf::Clock kKeyClock;
bool kKeyPressed = false;
sf::Time kKeyTime;
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if ( event.type == sf::Event::KeyReleased )
if ( event.key.code == sf::Keyboard::K )
{
kKeyTime = kKeyClock.getElapsedTime();
kKeyPressed = false;
}
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::K))
{
if ( !kKeyPressed )
{
kKeyClock.restart();
kKeyPressed = true;
}
}
}
这个解决方案是否足够准确,或者我可能误解了这个问题?
我认为sf :: Event不提供时间信息,但您可以确定是否查看了doc。我不知道其他窗口库。