From b693e2aeb70601cf9c4ea3785e3105808e3787e7 Mon Sep 17 00:00:00 2001 From: gulliver-madrid <49131885+gulliver-madrid@users.noreply.github.com> Date: Mon, 23 Oct 2023 12:47:28 +0200 Subject: [PATCH] =?UTF-8?q?A=C3=B1ade=20gesti=C3=B3n=20pausas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/nivel.cpp | 4 ++++ src/tiempo.cpp | 34 +++++++++++++++++++--------------- src/tiempo.h | 17 ++++++++--------- 3 files changed, 31 insertions(+), 24 deletions(-) diff --git a/src/nivel.cpp b/src/nivel.cpp index 3629e88a..253fa45a 100644 --- a/src/nivel.cpp +++ b/src/nivel.cpp @@ -108,9 +108,11 @@ void Nivel::procesa_cambio_de_fase( switch (nueva_fase) { case FaseNivel::Activa: assert(fase_previa == FaseNivel::MostrandoInstrucciones); + GestorTiempoJuego::activar(); break; case FaseNivel::EsperaAntesDeResultado: assert(fase_previa == FaseNivel::Activa); + GestorTiempoJuego::pausar(); timer_espera_antes_de_resultado.start( tiempos::RETARDO_ANTES_DE_RESULTADO ); @@ -146,6 +148,8 @@ AccionGeneral Nivel::ejecutar() { Timer timer_fin_nivel; sf::Sound sound; + GestorTiempoJuego::reiniciar(); + assert(!contadores.empty()); // std::cout << "Empezando ciclo de juego en nivel()" << std::endl; while (globales.window.isOpen()) { diff --git a/src/tiempo.cpp b/src/tiempo.cpp index e0041b32..828eef43 100644 --- a/src/tiempo.cpp +++ b/src/tiempo.cpp @@ -3,6 +3,11 @@ #include #include +// Asignacion miembros estaticos +TiempoJuego GestorTiempoJuego::previo = TiempoJuego_CERO; +Tiempo GestorTiempoJuego::ultima_activacion = Tiempo::CERO; +bool GestorTiempoJuego::en_pausa = true; + std::string pad_with_zeroes(int n) { assert(n >= 0); if (n > 59) { @@ -19,7 +24,7 @@ std::string pad_with_zeroes(int n) { // Tiempo ////////////////////////////////////////// -bool Tiempo::operator<(const Tiempo &otro) const { // fmt +bool Tiempo::operator<(const Tiempo &otro) const { // return _ms < otro._ms; } @@ -125,30 +130,29 @@ const TiempoJuego TiempoJuego::operator-(const TiempoJuego &otro) const { // GestorTiempoJuego ////////////////////////////////////////// -void GestorTiempoJuego::contabilizar() { - const auto actual = obtener_tiempo_actual(); - const auto transcurrido = actual - ultima_contabilizacion; - contabilizado = TiempoJuego::desde_milisegundos( - contabilizado.obtener_milisegundos() + - transcurrido.obtener_milisegundos() - ); -} - TiempoJuego GestorTiempoJuego::obtener_tiempo_juego() { - // TODO: implementar con pausas - return TiempoJuego::desde_milisegundos( - obtener_tiempo_actual().obtener_milisegundos() - ); + if (en_pausa) { + return previo; + } + const auto transcurrido = obtener_tiempo_actual() - ultima_activacion; + return previo + + TiempoJuego::desde_milisegundos(transcurrido.obtener_milisegundos()); } void GestorTiempoJuego::activar() { assert(en_pausa); + ultima_activacion = obtener_tiempo_actual(); en_pausa = false; } void GestorTiempoJuego::pausar() { assert(!en_pausa); + previo = obtener_tiempo_juego(); + en_pausa = true; +} +void GestorTiempoJuego::reiniciar() { en_pausa = true; + previo = TiempoJuego_CERO; + ultima_activacion = Tiempo::CERO; } -TiempoJuego GestorTiempoJuego::obtener_transcurrido() { return contabilizado; } const Tiempo Tiempo::CERO = Tiempo::desde_milisegundos(0); diff --git a/src/tiempo.h b/src/tiempo.h index fd370f1f..a78a72f4 100644 --- a/src/tiempo.h +++ b/src/tiempo.h @@ -82,19 +82,18 @@ struct TiempoPreparacion { // GestorTiempoJuego ////////////////////////////////////////// -/* Provisional. Debe poder activarse y pausarse */ struct GestorTiempoJuego { private: - TiempoJuego contabilizado = TiempoJuego_CERO; - Tiempo ultima_contabilizacion = Tiempo::CERO; - bool en_pausa = true; - void contabilizar(); + // Tiempo de juego contabilizado previamente + static TiempoJuego previo; + static Tiempo ultima_activacion; + static bool en_pausa; public: - GestorTiempoJuego() {} + GestorTiempoJuego() = delete; static TiempoJuego obtener_tiempo_juego(); - void activar(); - void pausar(); - TiempoJuego obtener_transcurrido(); + static void activar(); + static void pausar(); + static void reiniciar(); };