From 6c702e7e23408c50eea238875e6d2723853fba9e Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Tue, 16 Sep 2025 08:40:41 +0200 Subject: [PATCH] Logo: convertit per a usar delta time --- source/director.cpp | 2 +- source/sections/logo.cpp | 37 ++++++++++++++++++++++++++++--------- source/sections/logo.h | 9 +++++---- 3 files changed, 34 insertions(+), 14 deletions(-) diff --git a/source/director.cpp b/source/director.cpp index bbc9c43..3dc6a53 100644 --- a/source/director.cpp +++ b/source/director.cpp @@ -42,7 +42,7 @@ Director::Director(int argc, std::span argv) { Section::name = Section::Name::GAME; Section::options = Section::Options::GAME_PLAY_1P; #elif _DEBUG - Section::name = Section::Name::HI_SCORE_TABLE; + Section::name = Section::Name::LOGO; Section::options = Section::Options::GAME_PLAY_1P; #else // NORMAL GAME Section::name = Section::Name::LOGO; diff --git a/source/sections/logo.cpp b/source/sections/logo.cpp index be896ad..565705b 100644 --- a/source/sections/logo.cpp +++ b/source/sections/logo.cpp @@ -79,21 +79,23 @@ void Logo::checkInput() { } // Gestiona el logo de JAILGAMES -void Logo::updateJAILGAMES() { +void Logo::updateJAILGAMES(float delta_time) { if (counter_ == 30) { Audio::get()->playSound("logo.wav"); } if (counter_ > 30) { + const float pixels_to_move = SPEED * delta_time; + for (int i = 0; i < (int)jail_sprite_.size(); ++i) { if (jail_sprite_[i]->getX() != dest_.x) { if (i % 2 == 0) { - jail_sprite_[i]->incX(-SPEED); + jail_sprite_[i]->incX(-pixels_to_move); if (jail_sprite_[i]->getX() < dest_.x) { jail_sprite_[i]->setX(dest_.x); } } else { - jail_sprite_[i]->incX(SPEED); + jail_sprite_[i]->incX(pixels_to_move); if (jail_sprite_[i]->getX() > dest_.x) { jail_sprite_[i]->setX(dest_.x); } @@ -129,16 +131,21 @@ void Logo::updateTextureColors() { } // Actualiza las variables -void Logo::update() { - if (SDL_GetTicks() - ticks_ > param.game.speed) { - ticks_ = SDL_GetTicks(); // Actualiza el contador de ticks - Screen::get()->update(); // Actualiza el objeto screen +void Logo::update(float delta_time) { + static float logic_accumulator = 0.0f; + logic_accumulator += delta_time; - updateJAILGAMES(); // Actualiza el logo de JAILGAMES + // Ejecutar lógica a 60 FPS (cada 16.67ms) para mantener consistencia en counter_ y colores + constexpr float LOGIC_FRAME_TIME = 1000.0f / 60.0f; + + if (logic_accumulator >= LOGIC_FRAME_TIME) { + Screen::get()->update(); // Actualiza el objeto screen updateTextureColors(); // Actualiza los colores de las texturas ++counter_; // Gestiona el contador + logic_accumulator -= LOGIC_FRAME_TIME; } + updateJAILGAMES(delta_time); // Actualiza el logo de JAILGAMES con delta-time real Audio::update(); } @@ -154,11 +161,23 @@ void Logo::render() { SCREEN->render(); } +// Calcula el tiempo transcurrido desde el último frame +float Logo::calculateDeltaTime() { + const Uint64 current_time = SDL_GetTicks(); + const float delta_time = static_cast(current_time - last_time_); + last_time_ = current_time; + return delta_time; +} + // Bucle para el logo del juego void Logo::run() { + last_time_ = SDL_GetTicks(); + while (Section::name == Section::Name::LOGO) { + const float delta_time = calculateDeltaTime(); + checkInput(); - update(); + update(delta_time); checkEvents(); // Tiene que ir antes del render render(); } diff --git a/source/sections/logo.h b/source/sections/logo.h index 1e54e1a..e3ff75a 100644 --- a/source/sections/logo.h +++ b/source/sections/logo.h @@ -31,7 +31,7 @@ class Logo { static constexpr int INIT_FADE_COUNTER_MARK = 300; // Tiempo del contador cuando inicia el fade a negro static constexpr int END_LOGO_COUNTER_MARK = 400; // Tiempo del contador para terminar el logo static constexpr int POST_LOGO_DURATION = 20; // Tiempo que dura el logo con el fade al máximo - static constexpr int SPEED = 8; // Velocidad de desplazamiento de cada línea + static constexpr float SPEED = 8.0f / 15.0f; // Velocidad de desplazamiento de cada línea (píxeles por ms) // --- Objetos y punteros --- std::shared_ptr since_texture_; // Textura con los gráficos "Since 1998" @@ -42,15 +42,16 @@ class Logo { // --- Variables --- std::vector color_; // Vector con los colores para el fade int counter_ = 0; // Contador - Uint64 ticks_ = 0; // Contador de ticks para ajustar la velocidad del programa + Uint64 last_time_ = 0; // Último timestamp para calcular delta-time SDL_FPoint dest_; // Posición donde dibujar el logo // --- Métodos internos --- - void update(); // Actualiza las variables + void update(float delta_time); // Actualiza las variables void render(); // Dibuja en pantalla static void checkEvents(); // Comprueba el manejador de eventos static void checkInput(); // Comprueba las entradas - void updateJAILGAMES(); // Gestiona el logo de JAILGAMES + void updateJAILGAMES(float delta_time); // Gestiona el logo de JAILGAMES void renderJAILGAMES(); // Renderiza el logo de JAILGAMES void updateTextureColors(); // Gestiona el color de las texturas + float calculateDeltaTime(); // Calcula el tiempo transcurrido desde el último frame };