migrat Scoreboard a time based

This commit is contained in:
2025-10-31 09:30:33 +01:00
parent f08b2f9193
commit 1bb3d00e7c
4 changed files with 31 additions and 16 deletions

View File

@@ -30,8 +30,6 @@ Scoreboard::Scoreboard(std::shared_ptr<ScoreboardData> data)
surface_dest_ = {.x = 0, .y = Options::game.height - SURFACE_HEIGHT, .w = SURFACE_WIDTH, .h = SURFACE_HEIGHT}; surface_dest_ = {.x = 0, .y = Options::game.height - SURFACE_HEIGHT, .w = SURFACE_WIDTH, .h = SURFACE_HEIGHT};
// Inicializa las variables // Inicializa las variables
counter_ = 0;
change_color_speed_ = 4;
is_paused_ = false; is_paused_ = false;
paused_time_ = 0; paused_time_ = 0;
paused_time_elapsed_ = 0; paused_time_elapsed_ = 0;
@@ -50,12 +48,15 @@ void Scoreboard::render() {
} }
// Actualiza las variables del objeto // Actualiza las variables del objeto
void Scoreboard::update() { void Scoreboard::update(float delta_time) {
counter_++; // Acumular tiempo para animaciones
player_sprite_->update(); time_accumulator_ += delta_time;
// Actualizar sprite con delta time
player_sprite_->update(delta_time);
// Actualiza el color de la cantidad de items recogidos // Actualiza el color de la cantidad de items recogidos
updateItemsColor(); updateItemsColor(delta_time);
// Dibuja la textura // Dibuja la textura
fillTexture(); fillTexture();
@@ -98,12 +99,20 @@ void Scoreboard::setPaused(bool value) {
} }
// Actualiza el color de la cantidad de items recogidos // Actualiza el color de la cantidad de items recogidos
void Scoreboard::updateItemsColor() { void Scoreboard::updateItemsColor(float delta_time) {
if (!data_->jail_is_open) { if (!data_->jail_is_open) {
return; 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"); items_color_ = stringToColor("white");
} else { } else {
items_color_ = stringToColor("magenta"); items_color_ = stringToColor("magenta");
@@ -129,8 +138,9 @@ void Scoreboard::fillTexture() {
constexpr int LINE2 = 3 * TILE_SIZE; constexpr int LINE2 = 3 * TILE_SIZE;
// Dibuja las vidas // Dibuja las vidas
const int DESP = (counter_ / 40) % 8; // Calcular desplazamiento basado en tiempo
const int FRAME = DESP % 4; const int DESP = static_cast<int>(time_accumulator_ / SPRITE_WALK_CYCLE_DURATION) % 8;
const int FRAME = DESP % SPRITE_WALK_FRAMES;
player_sprite_->setCurrentAnimationFrame(FRAME); player_sprite_->setCurrentAnimationFrame(FRAME);
player_sprite_->setPosY(LINE2); player_sprite_->setPosY(LINE2);
for (int i = 0; i < data_->lives; ++i) { for (int i = 0; i < data_->lives; ++i) {

View File

@@ -68,22 +68,27 @@ class Scoreboard {
std::shared_ptr<ScoreboardData> data_; // Contiene las variables a mostrar en el marcador std::shared_ptr<ScoreboardData> data_; // Contiene las variables a mostrar en el marcador
std::shared_ptr<Surface> surface_; // Surface donde dibujar el marcador; std::shared_ptr<Surface> 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 // Variables
std::vector<Uint8> color_; // Vector con los colores del objeto std::vector<Uint8> 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 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_; // Milisegundos que ha estado el marcador en pausa
Uint32 paused_time_elapsed_; // Tiempo acumulado 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 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 Uint8 items_color_; // Color de la cantidad de items recogidos
SDL_FRect surface_dest_; // Rectangulo donde dibujar la surface del marcador 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 // Obtiene el tiempo transcurrido de partida
auto getTime() -> ClockData; auto getTime() -> ClockData;
// Actualiza el color de la cantidad de items recogidos // Actualiza el color de la cantidad de items recogidos
void updateItemsColor(); void updateItemsColor(float delta_time);
// Dibuja los elementos del marcador en la surface // Dibuja los elementos del marcador en la surface
void fillTexture(); void fillTexture();
@@ -99,7 +104,7 @@ class Scoreboard {
void render(); void render();
// Actualiza las variables del objeto // Actualiza las variables del objeto
void update(); void update(float delta_time);
// Pone el marcador en modo pausa // Pone el marcador en modo pausa
void setPaused(bool value); void setPaused(bool value);

View File

@@ -34,7 +34,7 @@ enum class Options {
// --- Variables de estado globales --- // --- Variables de estado globales ---
#ifdef _DEBUG #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 inline Options options = Options::LOGO_TO_LOADING_SCREEN; // Opciones de la escena actual
#else #else
inline Scene current = Scene::LOGO; // Escena actual inline Scene current = Scene::LOGO; // Escena actual

View File

@@ -139,7 +139,7 @@ void Game::update() {
checkSomeCheevos(); checkSomeCheevos();
} }
demoCheckRoomChange(DELTA_TIME); demoCheckRoomChange(DELTA_TIME);
scoreboard_->update(); scoreboard_->update(DELTA_TIME);
keepMusicPlaying(); keepMusicPlaying();
updateBlackScreen(DELTA_TIME); updateBlackScreen(DELTA_TIME);