From 1bb3d00e7c5ebcd3b8bcfab52c67c8261de567ea Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Fri, 31 Oct 2025 09:30:33 +0100 Subject: [PATCH] migrat Scoreboard a time based --- source/game/gameplay/scoreboard.cpp | 30 +++++++++++++++++++---------- source/game/gameplay/scoreboard.hpp | 13 +++++++++---- source/game/scene_manager.hpp | 2 +- source/game/scenes/game.cpp | 2 +- 4 files changed, 31 insertions(+), 16 deletions(-) diff --git a/source/game/gameplay/scoreboard.cpp b/source/game/gameplay/scoreboard.cpp index 88a4be6..ac7b51d 100644 --- a/source/game/gameplay/scoreboard.cpp +++ b/source/game/gameplay/scoreboard.cpp @@ -30,8 +30,6 @@ Scoreboard::Scoreboard(std::shared_ptr data) surface_dest_ = {.x = 0, .y = Options::game.height - SURFACE_HEIGHT, .w = SURFACE_WIDTH, .h = SURFACE_HEIGHT}; // Inicializa las variables - counter_ = 0; - change_color_speed_ = 4; is_paused_ = false; paused_time_ = 0; paused_time_elapsed_ = 0; @@ -50,12 +48,15 @@ void Scoreboard::render() { } // Actualiza las variables del objeto -void Scoreboard::update() { - counter_++; - player_sprite_->update(); +void Scoreboard::update(float delta_time) { + // Acumular tiempo para animaciones + time_accumulator_ += delta_time; + + // Actualizar sprite con delta time + player_sprite_->update(delta_time); // Actualiza el color de la cantidad de items recogidos - updateItemsColor(); + updateItemsColor(delta_time); // Dibuja la textura fillTexture(); @@ -98,12 +99,20 @@ void Scoreboard::setPaused(bool value) { } // Actualiza el color de la cantidad de items recogidos -void Scoreboard::updateItemsColor() { +void Scoreboard::updateItemsColor(float delta_time) { if (!data_->jail_is_open) { return; } - if (counter_ % 20 < 10) { + items_color_timer_ += delta_time; + + // Resetear timer cada 2 ciclos (0.666s total) + if (items_color_timer_ >= ITEMS_COLOR_BLINK_DURATION * 2.0F) { + items_color_timer_ = 0.0F; + } + + // Alternar color cada ITEMS_COLOR_BLINK_DURATION + if (items_color_timer_ < ITEMS_COLOR_BLINK_DURATION) { items_color_ = stringToColor("white"); } else { items_color_ = stringToColor("magenta"); @@ -129,8 +138,9 @@ void Scoreboard::fillTexture() { constexpr int LINE2 = 3 * TILE_SIZE; // Dibuja las vidas - const int DESP = (counter_ / 40) % 8; - const int FRAME = DESP % 4; + // Calcular desplazamiento basado en tiempo + const int DESP = static_cast(time_accumulator_ / SPRITE_WALK_CYCLE_DURATION) % 8; + const int FRAME = DESP % SPRITE_WALK_FRAMES; player_sprite_->setCurrentAnimationFrame(FRAME); player_sprite_->setPosY(LINE2); for (int i = 0; i < data_->lives; ++i) { diff --git a/source/game/gameplay/scoreboard.hpp b/source/game/gameplay/scoreboard.hpp index ff59e3f..d83f170 100644 --- a/source/game/gameplay/scoreboard.hpp +++ b/source/game/gameplay/scoreboard.hpp @@ -68,22 +68,27 @@ class Scoreboard { std::shared_ptr data_; // Contiene las variables a mostrar en el marcador std::shared_ptr surface_; // Surface donde dibujar el marcador; + // Constantes de tiempo + static constexpr float ITEMS_COLOR_BLINK_DURATION = 0.333F; // Duración de cada estado del parpadeo (era 10 frames @ 60fps) + static constexpr float SPRITE_WALK_CYCLE_DURATION = 0.667F; // Duración del ciclo de caminar (era 40 frames @ 60fps) + static constexpr int SPRITE_WALK_FRAMES = 4; // Número de frames de animación + // Variables std::vector color_; // Vector con los colores del objeto - int counter_; // Contador interno - int change_color_speed_; // Cuanto mas alto, mas tarda en cambiar de color bool is_paused_; // Indica si el marcador esta en modo pausa Uint32 paused_time_; // Milisegundos que ha estado el marcador en pausa Uint32 paused_time_elapsed_; // Tiempo acumulado en pausa ClockData clock_; // Contiene las horas, minutos y segundos transcurridos desde el inicio de la partida Uint8 items_color_; // Color de la cantidad de items recogidos SDL_FRect surface_dest_; // Rectangulo donde dibujar la surface del marcador + float time_accumulator_ = 0.0F; // Acumulador de tiempo para animaciones + float items_color_timer_ = 0.0F; // Timer para parpadeo de color de items // Obtiene el tiempo transcurrido de partida auto getTime() -> ClockData; // Actualiza el color de la cantidad de items recogidos - void updateItemsColor(); + void updateItemsColor(float delta_time); // Dibuja los elementos del marcador en la surface void fillTexture(); @@ -99,7 +104,7 @@ class Scoreboard { void render(); // Actualiza las variables del objeto - void update(); + void update(float delta_time); // Pone el marcador en modo pausa void setPaused(bool value); diff --git a/source/game/scene_manager.hpp b/source/game/scene_manager.hpp index 0dc91dc..9ee627a 100644 --- a/source/game/scene_manager.hpp +++ b/source/game/scene_manager.hpp @@ -34,7 +34,7 @@ enum class Options { // --- Variables de estado globales --- #ifdef _DEBUG -inline Scene current = Scene::ENDING2; // Escena actual +inline Scene current = Scene::GAME; // Escena actual inline Options options = Options::LOGO_TO_LOADING_SCREEN; // Opciones de la escena actual #else inline Scene current = Scene::LOGO; // Escena actual diff --git a/source/game/scenes/game.cpp b/source/game/scenes/game.cpp index 4ffd9b8..397a091 100644 --- a/source/game/scenes/game.cpp +++ b/source/game/scenes/game.cpp @@ -139,7 +139,7 @@ void Game::update() { checkSomeCheevos(); } demoCheckRoomChange(DELTA_TIME); - scoreboard_->update(); + scoreboard_->update(DELTA_TIME); keepMusicPlaying(); updateBlackScreen(DELTA_TIME);