time-based: nou DeltaTime + migrada escena Logo (constants en segons, fora counters)
This commit is contained in:
@@ -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
|
||||||
@@ -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
|
||||||
+18
-21
@@ -11,12 +11,16 @@
|
|||||||
#include "core/rendering/screen.h" // for Screen
|
#include "core/rendering/screen.h" // for Screen
|
||||||
#include "core/rendering/sprite.h" // for Sprite
|
#include "core/rendering/sprite.h" // for Sprite
|
||||||
#include "core/resources/resource.h"
|
#include "core/resources/resource.h"
|
||||||
|
#include "core/system/delta_time.hpp" // for DeltaTime::reset / tick
|
||||||
#include "game/defaults.hpp" // for bgColor, SECTION_PROG_LOGO, SECTION_PROG...
|
#include "game/defaults.hpp" // for bgColor, SECTION_PROG_LOGO, SECTION_PROG...
|
||||||
#include "utils/utils.h" // for Section, Color
|
#include "utils/utils.h" // for Section, Color
|
||||||
|
|
||||||
// Valores de inicialización y fin
|
// Durades de l'escena (segons). Time-based: ja no comptem frames. Valors
|
||||||
constexpr int INIT_FADE = 100;
|
// equivalents al comportament anterior (frame counter a 15ms): 100 i 200
|
||||||
constexpr int END_LOGO = 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
|
// Constructor
|
||||||
Logo::Logo(SDL_Renderer *renderer, Section *section) {
|
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);
|
sprite_ = new Sprite(14, 75, 226, 44, texture_, renderer);
|
||||||
|
|
||||||
// Inicializa variables
|
// Inicializa variables
|
||||||
counter_ = 0;
|
|
||||||
section->name = SECTION_PROG_LOGO;
|
section->name = SECTION_PROG_LOGO;
|
||||||
section->subsection = 0;
|
section->subsection = 0;
|
||||||
ticks_ = 0;
|
|
||||||
ticks_speed_ = 15;
|
|
||||||
|
|
||||||
Audio::get()->stopMusic();
|
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
|
// Destructor
|
||||||
@@ -48,7 +53,7 @@ Logo::~Logo() {
|
|||||||
|
|
||||||
// Comprueba si ha terminado el logo
|
// Comprueba si ha terminado el logo
|
||||||
void Logo::checkLogoEnd() {
|
void Logo::checkLogoEnd() {
|
||||||
if (counter_ >= END_LOGO + 20) {
|
if (elapsed_time_s_ >= SCENE_END_S) {
|
||||||
section_->name = SECTION_PROG_INTRO;
|
section_->name = SECTION_PROG_INTRO;
|
||||||
section_->subsection = 0;
|
section_->subsection = 0;
|
||||||
}
|
}
|
||||||
@@ -68,9 +73,8 @@ void Logo::checkInput() {
|
|||||||
|
|
||||||
// Dibuja el fade
|
// Dibuja el fade
|
||||||
void Logo::renderFade() {
|
void Logo::renderFade() {
|
||||||
// Dibuja el fade
|
if (elapsed_time_s_ >= FADE_START_S) {
|
||||||
if (counter_ >= INIT_FADE) {
|
const float STEP = (elapsed_time_s_ - FADE_START_S) / (FADE_END_S - FADE_START_S);
|
||||||
const float STEP = (float)(counter_ - INIT_FADE) / (float)(END_LOGO - INIT_FADE);
|
|
||||||
const int ALPHA = std::min((int)(255 * STEP), 255);
|
const int ALPHA = std::min((int)(255 * STEP), 255);
|
||||||
SDL_SetRenderDrawColor(renderer_, BG_COLOR.r, BG_COLOR.g, BG_COLOR.b, ALPHA);
|
SDL_SetRenderDrawColor(renderer_, BG_COLOR.r, BG_COLOR.g, BG_COLOR.b, ALPHA);
|
||||||
SDL_RenderFillRect(renderer_, nullptr);
|
SDL_RenderFillRect(renderer_, nullptr);
|
||||||
@@ -78,20 +82,12 @@ void Logo::renderFade() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Actualiza las variables del objeto
|
// Actualiza las variables del objeto
|
||||||
void Logo::update() {
|
void Logo::update(float delta_time_s) {
|
||||||
Audio::update();
|
Audio::update();
|
||||||
checkInput();
|
checkInput();
|
||||||
|
|
||||||
if (SDL_GetTicks() - ticks_ > ticks_speed_) {
|
elapsed_time_s_ += delta_time_s;
|
||||||
// Actualiza el contador de ticks
|
|
||||||
ticks_ = SDL_GetTicks();
|
|
||||||
|
|
||||||
// Actualiza el contador
|
|
||||||
counter_++;
|
|
||||||
|
|
||||||
// Comprueba si ha terminado el logo
|
|
||||||
checkLogoEnd();
|
checkLogoEnd();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dibuja el objeto en pantalla
|
// Dibuja el objeto en pantalla
|
||||||
@@ -123,7 +119,8 @@ void Logo::run() {
|
|||||||
|
|
||||||
// Ejecuta un frame
|
// Ejecuta un frame
|
||||||
void Logo::iterate() {
|
void Logo::iterate() {
|
||||||
update();
|
const float DELTA_TIME_S = DeltaTime::tick();
|
||||||
|
update(DELTA_TIME_S);
|
||||||
render();
|
render();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -26,12 +26,10 @@ class Logo {
|
|||||||
Sprite *sprite_; // Sprite con la textura del logo
|
Sprite *sprite_; // Sprite con la textura del logo
|
||||||
Section *section_; // Estado del bucle principal para saber si continua o se sale
|
Section *section_; // Estado del bucle principal para saber si continua o se sale
|
||||||
|
|
||||||
// Variables
|
// Temps acumulat de l'escena (segons). Time-based: no comptem frames.
|
||||||
Uint32 ticks_; // Contador de ticks para ajustar la velocidad del programa
|
float elapsed_time_s_{0.0F};
|
||||||
Uint32 ticks_speed_; // Velocidad a la que se repiten los bucles del programa
|
|
||||||
int counter_; // Contador
|
|
||||||
|
|
||||||
void update(); // Actualiza las variables del objeto
|
void update(float delta_time_s); // Actualiza las variables del objeto
|
||||||
void render(); // Dibuja el objeto en pantalla
|
void render(); // Dibuja el objeto en pantalla
|
||||||
void checkLogoEnd(); // Comprueba si ha terminado el logo
|
void checkLogoEnd(); // Comprueba si ha terminado el logo
|
||||||
void checkInput(); // Comprueba las entradas
|
void checkInput(); // Comprueba las entradas
|
||||||
|
|||||||
Reference in New Issue
Block a user