2015-08-21 32 views
0

问题

如果用户想知道一个键被按下,使用内SFML事件轮询循环的“精确”时间精确事件计时,一个可能的方法是查询附带捆绑时间戳数据每sf::Event与SFML

但是我没有在文档中发现任何建议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

该解决方案需要为每个要测量的按键实例化一个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没有提供时间信息,但是您可以确定您是否看过文档。我不知道其他窗口库。