A diferencia de otras bibliotecas en las que el tiempo se representa con un entero en milisegundos o un numero de como flotante en segundos SFML no impone ninguna regla sobre esto y todos los tiempos que maneja la biblioteca los hace a través de la clase sf::Time que nos permite obtener el tiempo en segundos, milisegundos o microsegundos que nos da un gran juego para controlar el tiempo.
Hay que tener en cuenta que sf::Time maneja unidades de tiempo, pero relativamente, no es para obtener fechas es para almacenar una cantidad de tiempo que según el contexto puede significar una cosa u otra.
Creando objetos de Tiempo
Los objetos sf::Time se pueden construir con segundos, milisegundos o microsegundos usando las funciones definidas (no miembros).
// Creamos tres tiempos diferentes
sf::Time t1 = sf::seconds(0.1f);
sf::Time t2 = sf::milliseconds(100);
sf::Time t3 = sf::microseconds(100000);
// Los mostramos en pantalla como segundos
std::cout << t1.asSeconds() << std::endl;
std::cout << t2.asSeconds() << std::endl;
std::cout << t3.asSeconds() << std::endl;
Que tiene como salida por pantalla lo siguiente:
0.1 0.1 0.1
Como vemos da igual como almacenemos el tiempo luego lo podemos recuperar como segundos, milisegundos o microsegundos usando los métodos asSeconds, asMilliseconds y asMicroseconds. Internamente se almacena como un entero de 64 bits por si alguien tiene curiosidad.
Lo bueno de esta clase es que podemos hacer cosas como la siguiente.
sf::Time t2 = t1 * 2;
sf::Time t3 = t1 + t2;
sf::Time t4 = -t3;
bool b1 = (t1 == t2);
bool b2 = (t3 > t4);
Lo que nos da un gran juego para operar y comparar tiempos independientemente de si los tratamos como segundos, milisegundos o microsegundos.
Relojes, midiendo el tiempo
Ahora que tenemos la manera de almacenar y representar el tiempo necesitamos algo para medirlo, de eso se encarga sf::Clock. Esta clase solo tiene dos métodos: getElapsedTime, que devuelve el tiempo pasado desde que se creo o se reinició el reloj, y restart que reinicia el reloj.
sf::Clock clock; // inicia el reloj
/* otro código ... */
sf::Time elapsed1 = clock.getElapsedTime();
std::cout << elapsed1.asSeconds() << std::endl;
clock.restart();
/* otro código ... */
sf::Time elapsed2 = clock.getElapsedTime();
std::cout << elapsed2.asSeconds() << std::endl;
Una operación típica es obtener el tiempo pasado y acto seguido reiniciar el reloj que lo haríamos así:
sf::Clock clock
/* otro código ... */
sf::Time t = clock.getElapsedTime();
clock.restart();
Pero la función restart devuelve también el tiempo pasado antes de reiniciar así que se podría hacer lo siguiente.
sf::Clock clock
/* otro código ... */
sf::Time t = clock.restart();
Conclusiones
Con esto ya sabemos como Almacenar y contar el tiempo en nuestras aplicaciones SFML, en el próximo artículo ya empezaremos a tocar el apartado gráfico de SFML.
En Genbeta Dev | SFML 2, biblioteca para el desarrollo de videojuegos En Genbeta Dev | SFML 2: Crear un entorno de trabajo En Genbeta Dev | SFML 2: Crear una ventana