time-based: nou DeltaTime + migrada escena Logo (constants en segons, fora counters)

This commit is contained in:
2026-05-18 21:57:31 +02:00
parent 081a7e02c7
commit f1a6636222
4 changed files with 70 additions and 33 deletions
+22
View File
@@ -0,0 +1,22 @@
#include "core/system/delta_time.hpp"
#include <SDL3/SDL.h>
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<float>(NOW_MS - last_time_ms) / 1000.0F;
last_time_ms = NOW_MS;
return DELTA_S;
}
} // namespace DeltaTime
+20
View File
@@ -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
+21 -24
View File
@@ -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();
}
+7 -9
View File
@@ -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
};