Gérer le temps
Le temps dans SFML
Contrairement à de nombreuses autres bibliothèques qui définissent le temps comme étant des millisecondes en uint32, ou des secondes en float, SFML
n'impose aucune unité et aucun type pour les variables de temps. Au lieu de cela, SFML laisse ce choix à l'utilisateur à travers une classe
flexible : sf::Time
. Toutes les classes et fonctions SFML qui manipulent du temps utilisent cette classe.
sf::Time
encapsule une valeur de temps (en d'autres termes, un laps de temps). Ce n'est pas une classe de date, qui
représenterait l'année/mois/jour/heure/minute/seconde courante, c'est juste une valeur qui représente une certaine quantité de temps, et la manière
de l'interpréter dépend de son contexte d'utilisation.
Conversion de temps
Une variable de type sf::Time
peut être construite à partir de différentes unités : secondes, millisecondes et microsecondes.
Il existe dans SFML une fonction (non-membre) pour convertir chacune d'elles en sf::Time
:
sf::Time t1 = sf::microseconds(10000);
sf::Time t2 = sf::milliseconds(10);
sf::Time t3 = sf::seconds(0.01f);
Notez que ces trois variables sont toutes égales.
De la même manière, une variable sf::Time
peut être convertie en secondes, en millisecondes ou en microsecondes :
sf::Time time = ...;
sf::Int64 usec = time.asMicroseconds();
sf::Int32 msec = time.asMilliseconds();
float sec = time.asSeconds();
Jouer avec les valeurs de temps
La classe sf::Time
représentant simplement une quantité de temps, elle supporte les opérations arithmétiques telles que l'addition,
la soustraction, les comparaisons, etc. Les temps peuvent aussi être négatifs.
sf::Time t1 = ...;
sf::Time t2 = t1 * 2;
sf::Time t3 = t1 + t2;
sf::Time t4 = -t3;
bool b1 = (t1 == t2);
bool b2 = (t3 > t4);
Mesurer le temps
Maintenant que nous avons vu comment manipuler les variables de temps avec SFML, voyons comment faire quelque chose dont à peu près tous les programmes ont besoin : mesurer le temps écoulé.
SFML a une classe très simple pour mesurer le temps : sf::Clock
. Elle ne possède que deux fonctions : getElapsedTime
,
pour récupérer le temps écoulé depuis son démarrage, et restart
, pour la redémarrer.
sf::Clock clock; // démarre le chrono
...
sf::Time elapsed1 = clock.getElapsedTime();
std::cout << elapsed1.asSeconds() << std::endl;
clock.restart();
...
sf::Time elapsed2 = clock.getElapsedTime();
std::cout << elapsed2.asSeconds() << std::endl;
Notez que restart
renvoie également le temps écoulé, de façon à éviter le tout petit écart de temps qui existerait si vous aviez à
appeler getElapsedTime
explicitement avant restart
.
Voici un exemple qui utilise le temps écoulé à chaque itération de la boucle principale pour mettre à jour la logique du jeu :
sf::Clock clock;
while (window.isOpen())
{
sf::Time elapsed = clock.restart();
updateGame(elapsed);
...
}