From f1a6636222f64a930bb547571ceceb34a4e847d9 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Mon, 18 May 2026 21:57:31 +0200 Subject: [PATCH] time-based: nou DeltaTime + migrada escena Logo (constants en segons, fora counters) --- source/core/system/delta_time.cpp | 22 +++++++++++++++ source/core/system/delta_time.hpp | 20 ++++++++++++++ source/game/scenes/logo.cpp | 45 +++++++++++++++---------------- source/game/scenes/logo.h | 16 +++++------ 4 files changed, 70 insertions(+), 33 deletions(-) create mode 100644 source/core/system/delta_time.cpp create mode 100644 source/core/system/delta_time.hpp diff --git a/source/core/system/delta_time.cpp b/source/core/system/delta_time.cpp new file mode 100644 index 0000000..115a6a8 --- /dev/null +++ b/source/core/system/delta_time.cpp @@ -0,0 +1,22 @@ +#include "core/system/delta_time.hpp" + +#include + +namespace DeltaTime { + + namespace { + Uint64 last_time_ms = 0; + } + + void reset() { + last_time_ms = SDL_GetTicks(); + } + + auto tick() -> float { + const Uint64 NOW_MS = SDL_GetTicks(); + const float DELTA_S = static_cast(NOW_MS - last_time_ms) / 1000.0F; + last_time_ms = NOW_MS; + return DELTA_S; + } + +} // namespace DeltaTime diff --git a/source/core/system/delta_time.hpp b/source/core/system/delta_time.hpp new file mode 100644 index 0000000..351916c --- /dev/null +++ b/source/core/system/delta_time.hpp @@ -0,0 +1,20 @@ +#pragma once + +// Font única de delta_time per al joc. El loop principal NO té vsync ni +// gates: cada escena crida `tick()` al començament del seu iterate() i rep +// els segons reals transcorreguts des de l'última crida. Així el moviment és +// independent del framerate (visualment suau a 2000 FPS o a 60 FPS). +// +// `reset()` reinicia el rellotge intern: cal cridar-lo en cada canvi +// d'escena (després de càrregues llargues que podrien generar un primer +// delta enorme) i quan es reprèn d'una pausa. + +namespace DeltaTime { + + // Reinicia el rellotge a "ara". Cap delta acumulat del passat. + void reset(); + + // Retorna els segons des de l'última crida a `tick()` o `reset()`. + auto tick() -> float; + +} // namespace DeltaTime diff --git a/source/game/scenes/logo.cpp b/source/game/scenes/logo.cpp index ea30fa4..d271909 100644 --- a/source/game/scenes/logo.cpp +++ b/source/game/scenes/logo.cpp @@ -11,12 +11,16 @@ #include "core/rendering/screen.h" // for Screen #include "core/rendering/sprite.h" // for Sprite #include "core/resources/resource.h" -#include "game/defaults.hpp" // for bgColor, SECTION_PROG_LOGO, SECTION_PROG... -#include "utils/utils.h" // for Section, Color +#include "core/system/delta_time.hpp" // for DeltaTime::reset / tick +#include "game/defaults.hpp" // for bgColor, SECTION_PROG_LOGO, SECTION_PROG... +#include "utils/utils.h" // for Section, Color -// Valores de inicialización y fin -constexpr int INIT_FADE = 100; -constexpr int END_LOGO = 200; +// Durades de l'escena (segons). Time-based: ja no comptem frames. Valors +// equivalents al comportament anterior (frame counter a 15ms): 100 i 200 +// frames ⇒ 1.5s i 3.0s; fi a 220 frames ⇒ 3.3s. +constexpr float FADE_START_S = 1.5F; +constexpr float FADE_END_S = 3.0F; +constexpr float SCENE_END_S = 3.3F; // Constructor Logo::Logo(SDL_Renderer *renderer, Section *section) { @@ -30,13 +34,14 @@ Logo::Logo(SDL_Renderer *renderer, Section *section) { sprite_ = new Sprite(14, 75, 226, 44, texture_, renderer); // Inicializa variables - counter_ = 0; section->name = SECTION_PROG_LOGO; section->subsection = 0; - ticks_ = 0; - ticks_speed_ = 15; Audio::get()->stopMusic(); + + // Reset del rellotge: la primera crida a tick() retornarà ~0 i no un + // delta gegant arrossegat des del boot o l'escena anterior. + DeltaTime::reset(); } // Destructor @@ -48,7 +53,7 @@ Logo::~Logo() { // Comprueba si ha terminado el logo void Logo::checkLogoEnd() { - if (counter_ >= END_LOGO + 20) { + if (elapsed_time_s_ >= SCENE_END_S) { section_->name = SECTION_PROG_INTRO; section_->subsection = 0; } @@ -68,9 +73,8 @@ void Logo::checkInput() { // Dibuja el fade void Logo::renderFade() { - // Dibuja el fade - if (counter_ >= INIT_FADE) { - const float STEP = (float)(counter_ - INIT_FADE) / (float)(END_LOGO - INIT_FADE); + if (elapsed_time_s_ >= FADE_START_S) { + const float STEP = (elapsed_time_s_ - FADE_START_S) / (FADE_END_S - FADE_START_S); const int ALPHA = std::min((int)(255 * STEP), 255); SDL_SetRenderDrawColor(renderer_, BG_COLOR.r, BG_COLOR.g, BG_COLOR.b, ALPHA); SDL_RenderFillRect(renderer_, nullptr); @@ -78,20 +82,12 @@ void Logo::renderFade() { } // Actualiza las variables del objeto -void Logo::update() { +void Logo::update(float delta_time_s) { Audio::update(); checkInput(); - if (SDL_GetTicks() - ticks_ > ticks_speed_) { - // Actualiza el contador de ticks - ticks_ = SDL_GetTicks(); - - // Actualiza el contador - counter_++; - - // Comprueba si ha terminado el logo - checkLogoEnd(); - } + elapsed_time_s_ += delta_time_s; + checkLogoEnd(); } // Dibuja el objeto en pantalla @@ -123,7 +119,8 @@ void Logo::run() { // Ejecuta un frame void Logo::iterate() { - update(); + const float DELTA_TIME_S = DeltaTime::tick(); + update(DELTA_TIME_S); render(); } diff --git a/source/game/scenes/logo.h b/source/game/scenes/logo.h index caef369..82184ac 100644 --- a/source/game/scenes/logo.h +++ b/source/game/scenes/logo.h @@ -26,14 +26,12 @@ class Logo { Sprite *sprite_; // Sprite con la textura del logo Section *section_; // Estado del bucle principal para saber si continua o se sale - // Variables - Uint32 ticks_; // Contador de ticks para ajustar la velocidad del programa - Uint32 ticks_speed_; // Velocidad a la que se repiten los bucles del programa - int counter_; // Contador + // Temps acumulat de l'escena (segons). Time-based: no comptem frames. + float elapsed_time_s_{0.0F}; - void update(); // Actualiza las variables del objeto - void render(); // Dibuja el objeto en pantalla - void checkLogoEnd(); // Comprueba si ha terminado el logo - void checkInput(); // Comprueba las entradas - void renderFade(); // Dibuja el fade + void update(float delta_time_s); // Actualiza las variables del objeto + void render(); // Dibuja el objeto en pantalla + void checkLogoEnd(); // Comprueba si ha terminado el logo + void checkInput(); // Comprueba las entradas + void renderFade(); // Dibuja el fade };