diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..ea43e1b --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,9 @@ +{ + "permissions": { + "allow": [ + "Bash(make:*)" + ], + "deny": [], + "ask": [] + } +} \ No newline at end of file diff --git a/source/background.cpp b/source/background.cpp index b1409e8..d16ecc8 100644 --- a/source/background.cpp +++ b/source/background.cpp @@ -126,7 +126,14 @@ void Background::initializeTextures() { } // Actualiza la lógica del objeto +// Actualiza la lógica del objeto (compatibilidad) void Background::update() { + constexpr float FRAME_TIME_MS = 1000.0f / 60.0f; // 16.67ms por frame a 60 FPS + update(FRAME_TIME_MS); +} + +// Actualiza la lógica del objeto +void Background::update(float delta_time) { // Actualiza la progresión y calcula transiciones if (!manual_mode_) { updateProgression(); diff --git a/source/background.h b/source/background.h index c3e0e49..00d612d 100644 --- a/source/background.h +++ b/source/background.h @@ -31,7 +31,8 @@ class Background { ~Background(); // Destructor // --- Métodos principales --- - void update(); // Actualiza la lógica del objeto + void update(); // Actualiza la lógica del objeto (compatibilidad) + void update(float delta_time); // Actualiza la lógica del objeto void render(); // Dibuja el objeto void reset(); // Reinicia la progresión diff --git a/source/director.cpp b/source/director.cpp index 3dc6a53..bbc9c43 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::LOGO; + Section::name = Section::Name::HI_SCORE_TABLE; Section::options = Section::Options::GAME_PLAY_1P; #else // NORMAL GAME Section::name = Section::Name::LOGO; diff --git a/source/fade.cpp b/source/fade.cpp index 61257e5..eb7d1b9 100644 --- a/source/fade.cpp +++ b/source/fade.cpp @@ -82,6 +82,11 @@ void Fade::update() { } } +// Compatibilidad delta-time (ignora el parámetro ya que usa SDL_GetTicks) +void Fade::update(float delta_time) { + update(); // Llama al método original +} + void Fade::updatePreState() { // Sistema basado en tiempo únicamente Uint32 elapsed_time = SDL_GetTicks() - pre_start_time_; diff --git a/source/fade.h b/source/fade.h index 4ea96fe..3bb6da7 100644 --- a/source/fade.h +++ b/source/fade.h @@ -37,10 +37,11 @@ class Fade { ~Fade(); // --- Métodos principales --- - void reset(); // Resetea variables para reutilizar el fade - void render(); // Dibuja la transición en pantalla - void update(); // Actualiza el estado interno - void activate(); // Activa el fade + void reset(); // Resetea variables para reutilizar el fade + void render(); // Dibuja la transición en pantalla + void update(); // Actualiza el estado interno (ya usa tiempo real) + void update(float delta_time); // Compatibilidad delta-time (ignora el parámetro) + void activate(); // Activa el fade // --- Configuración --- void setColor(Uint8 r, Uint8 g, Uint8 b); // Establece el color RGB del fade diff --git a/source/sections/hiscore_table.cpp b/source/sections/hiscore_table.cpp index ee7a2ad..a67612d 100644 --- a/source/sections/hiscore_table.cpp +++ b/source/sections/hiscore_table.cpp @@ -33,7 +33,7 @@ HiScoreTable::HiScoreTable() backbuffer_(SDL_CreateTexture(renderer_, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, param.game.width, param.game.height)), fade_(std::make_unique()), background_(std::make_unique()), - ticks_(0), + last_time_(0), view_area_(SDL_FRect{0, 0, param.game.width, param.game.height}), fade_mode_(Fade::Mode::IN), background_fade_color_(Color(0, 0, 0)) { @@ -53,17 +53,14 @@ HiScoreTable::~HiScoreTable() { } // Actualiza las variables -void HiScoreTable::update() { - if (SDL_GetTicks() - ticks_ > param.game.speed) { - ticks_ = SDL_GetTicks(); // Actualiza el contador de ticks - Screen::get()->update(); // Actualiza el objeto screen +void HiScoreTable::update(float delta_time) { + Screen::get()->update(); // Actualiza el objeto screen - updateSprites(); // Actualiza las posiciones de los sprites de texto - background_->update(); // Actualiza el fondo - updateFade(); // Gestiona el fade - updateCounter(); // Gestiona el contador y sus eventos - fillTexture(); // Dibuja los sprites en la textura - } + updateSprites(delta_time); // Actualiza las posiciones de los sprites de texto + background_->update(delta_time); // Actualiza el fondo + updateFade(delta_time); // Gestiona el fade + updateCounter(); // Gestiona el contador y sus eventos + fillTexture(); // Dibuja los sprites en la textura Audio::update(); } @@ -117,20 +114,32 @@ void HiScoreTable::checkInput() { GlobalInputs::check(); } +// Calcula el tiempo transcurrido desde el último frame +float HiScoreTable::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 la pantalla de instrucciones void HiScoreTable::run() { + last_time_ = SDL_GetTicks(); Audio::get()->playMusic("title.ogg"); + while (Section::name == Section::Name::HI_SCORE_TABLE) { + const float delta_time = calculateDeltaTime(); + checkInput(); - update(); + update(delta_time); checkEvents(); // Tiene que ir antes del render render(); } } // Gestiona el fade -void HiScoreTable::updateFade() { - fade_->update(); +void HiScoreTable::updateFade(float delta_time) { + fade_->update(delta_time); if (fade_->hasEnded() && fade_mode_ == Fade::Mode::IN) { fade_->reset(); @@ -249,7 +258,7 @@ void HiScoreTable::createSprites() { } // Actualiza las posiciones de los sprites de texto -void HiScoreTable::updateSprites() { +void HiScoreTable::updateSprites(float delta_time) { constexpr int INIT_COUNTER = 190; const int COUNTER_BETWEEN_ENTRIES = 16; if (counter_ >= INIT_COUNTER) { @@ -262,7 +271,7 @@ void HiScoreTable::updateSprites() { } } for (auto const &entry : entry_names_) { - entry->update(); + entry->update(delta_time); } glowEntryNames(); diff --git a/source/sections/hiscore_table.h b/source/sections/hiscore_table.h index 606c93c..ef3e685 100644 --- a/source/sections/hiscore_table.h +++ b/source/sections/hiscore_table.h @@ -45,26 +45,27 @@ class HiScoreTable { // --- Variables --- Uint16 counter_ = 0; // Contador - Uint64 ticks_; // Contador de ticks para ajustar la velocidad del programa + Uint64 last_time_ = 0; // Último timestamp para calcular delta-time SDL_FRect view_area_; // Parte de la textura que se muestra en pantalla Fade::Mode fade_mode_; // Modo de fade a utilizar Color background_fade_color_; // Color de atenuación del fondo std::vector entry_colors_; // Colores para destacar las entradas en la tabla // --- Métodos internos --- - void update(); // Actualiza las variables + void update(float delta_time); // Actualiza las variables void render(); // Pinta en pantalla static void checkEvents(); // Comprueba los eventos static void checkInput(); // Comprueba las entradas static auto format(int number) -> std::string; // Convierte un entero a un string con separadores de miles void fillTexture(); // Dibuja los sprites en la textura - void updateFade(); // Gestiona el fade + void updateFade(float delta_time); // Gestiona el fade void createSprites(); // Crea los sprites con los textos - void updateSprites(); // Actualiza las posiciones de los sprites de texto + void updateSprites(float delta_time); // Actualiza las posiciones de los sprites de texto void initFade(); // Inicializa el fade void initBackground(); // Inicializa el fondo auto getEntryColor(int counter) -> Color; // Obtiene un color del vector de colores de entradas void iniEntryColors(); // Inicializa los colores de las entradas void glowEntryNames(); // Hace brillar los nombres de la tabla de records void updateCounter(); // Gestiona el contador + float calculateDeltaTime(); // Calcula el tiempo transcurrido desde el último frame }; \ No newline at end of file