From 9acd9aa6319d4dadc1e5af68f60673556d084f88 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Wed, 17 Sep 2025 13:25:16 +0200 Subject: [PATCH] magic numbers: intro.cpp --- source/sections/intro.cpp | 62 ++++++++++++++++---------------- source/sections/intro.h | 76 ++++++++++++++++++++++++++++++--------- source/writer.cpp | 8 ++--- source/writer.h | 2 +- 4 files changed, 94 insertions(+), 54 deletions(-) diff --git a/source/sections/intro.cpp b/source/sections/intro.cpp index 6596366..0030d20 100644 --- a/source/sections/intro.cpp +++ b/source/sections/intro.cpp @@ -286,7 +286,7 @@ void Intro::initSprites() { // Constantes constexpr int TOTAL_SPRITES = TEXTURE_LIST.size(); - const float BORDER = 2.0F; + const float BORDER = CARD_BORDER_SIZE; auto texture = Resource::get()->getTexture(TEXTURE_LIST.front()); const float CARD_WIDTH = texture->getWidth() + (BORDER * 2); @@ -338,16 +338,16 @@ void Intro::initSprites() { const float X_DEST = param.game.game_area.center_x - (CARD_WIDTH / 2); const float Y_DEST = param.game.game_area.first_quarter_y - (CARD_HEIGHT / 4); - card_sprites_.at(0)->addPath(-CARD_WIDTH - 10, X_DEST, PathType::HORIZONTAL, Y_DEST, 100, easeInOutExpo, 0); - card_sprites_.at(1)->addPath(param.game.width, X_DEST, PathType::HORIZONTAL, Y_DEST, 100, easeOutBounce, 0); - card_sprites_.at(2)->addPath(-CARD_HEIGHT, Y_DEST, PathType::VERTICAL, X_DEST, 40, easeOutQuint, 0); - card_sprites_.at(3)->addPath(param.game.height, Y_DEST, PathType::VERTICAL, X_DEST, 300, easeInOutExpo, 0); - card_sprites_.at(4)->addPath(-CARD_HEIGHT, Y_DEST, PathType::VERTICAL, X_DEST, 70, easeOutElastic, 0); - card_sprites_.at(5)->addPath(-CARD_HEIGHT, Y_DEST, PathType::VERTICAL, X_DEST, 250, easeOutQuad, 450); - card_sprites_.at(5)->addPath(X_DEST, -CARD_WIDTH, PathType::HORIZONTAL, Y_DEST, 80, easeInElastic, 0); + card_sprites_.at(0)->addPath(-CARD_WIDTH - CARD_OFFSET_MARGIN, X_DEST, PathType::HORIZONTAL, Y_DEST, CARD_ANIM_DURATION_NORMAL, easeInOutExpo, 0); + card_sprites_.at(1)->addPath(param.game.width, X_DEST, PathType::HORIZONTAL, Y_DEST, CARD_ANIM_DURATION_NORMAL, easeOutBounce, 0); + card_sprites_.at(2)->addPath(-CARD_HEIGHT, Y_DEST, PathType::VERTICAL, X_DEST, CARD_ANIM_DURATION_FAST, easeOutQuint, 0); + card_sprites_.at(3)->addPath(param.game.height, Y_DEST, PathType::VERTICAL, X_DEST, CARD_ANIM_DURATION_VERY_SLOW, easeInOutExpo, 0); + card_sprites_.at(4)->addPath(-CARD_HEIGHT, Y_DEST, PathType::VERTICAL, X_DEST, CARD_ANIM_DURATION_MEDIUM, easeOutElastic, 0); + card_sprites_.at(5)->addPath(-CARD_HEIGHT, Y_DEST, PathType::VERTICAL, X_DEST, CARD_ANIM_DURATION_SLOW, easeOutQuad, CARD_ANIM_DELAY_LONG); + card_sprites_.at(5)->addPath(X_DEST, -CARD_WIDTH, PathType::HORIZONTAL, Y_DEST, CARD_ANIM_DURATION_SHORT, easeInElastic, 0); // Constantes - const float DESP = 8; + const float DESP = SHADOW_OFFSET; const float SHADOW_SPRITE_WIDTH = CARD_WIDTH; const float SHADOW_SPRITE_HEIGHT = CARD_HEIGHT; @@ -389,13 +389,13 @@ void Intro::initSprites() { const float S_X_DEST = X_DEST + DESP; const float S_Y_DEST = Y_DEST + DESP; - shadow_sprites_.at(0)->addPath(param.game.height + 10, S_Y_DEST, PathType::VERTICAL, S_X_DEST, 100, easeInOutExpo, 0); - shadow_sprites_.at(1)->addPath(-SHADOW_SPRITE_HEIGHT, S_Y_DEST, PathType::VERTICAL, S_X_DEST, 100, easeOutBounce, 0); - shadow_sprites_.at(2)->addPath(-SHADOW_SPRITE_WIDTH, S_X_DEST, PathType::HORIZONTAL, S_Y_DEST, 40, easeOutQuint, 0); - shadow_sprites_.at(3)->addPath(-SHADOW_SPRITE_HEIGHT, S_Y_DEST, PathType::VERTICAL, S_X_DEST, 300, easeInOutExpo, 0); - shadow_sprites_.at(4)->addPath(param.game.height, S_Y_DEST, PathType::VERTICAL, S_X_DEST, 70, easeOutElastic, 0); - shadow_sprites_.at(5)->addPath(param.game.width, S_X_DEST, PathType::HORIZONTAL, S_Y_DEST, 250, easeOutQuad, 450); - shadow_sprites_.at(5)->addPath(S_X_DEST, param.game.width, PathType::HORIZONTAL, S_Y_DEST, 80, easeInElastic, 0); + shadow_sprites_.at(0)->addPath(param.game.height + CARD_OFFSET_MARGIN, S_Y_DEST, PathType::VERTICAL, S_X_DEST, CARD_ANIM_DURATION_NORMAL, easeInOutExpo, 0); + shadow_sprites_.at(1)->addPath(-SHADOW_SPRITE_HEIGHT, S_Y_DEST, PathType::VERTICAL, S_X_DEST, CARD_ANIM_DURATION_NORMAL, easeOutBounce, 0); + shadow_sprites_.at(2)->addPath(-SHADOW_SPRITE_WIDTH, S_X_DEST, PathType::HORIZONTAL, S_Y_DEST, CARD_ANIM_DURATION_FAST, easeOutQuint, 0); + shadow_sprites_.at(3)->addPath(-SHADOW_SPRITE_HEIGHT, S_Y_DEST, PathType::VERTICAL, S_X_DEST, CARD_ANIM_DURATION_VERY_SLOW, easeInOutExpo, 0); + shadow_sprites_.at(4)->addPath(param.game.height, S_Y_DEST, PathType::VERTICAL, S_X_DEST, CARD_ANIM_DURATION_MEDIUM, easeOutElastic, 0); + shadow_sprites_.at(5)->addPath(param.game.width, S_X_DEST, PathType::HORIZONTAL, S_Y_DEST, CARD_ANIM_DURATION_SLOW, easeOutQuad, CARD_ANIM_DELAY_LONG); + shadow_sprites_.at(5)->addPath(S_X_DEST, param.game.width, PathType::HORIZONTAL, S_Y_DEST, CARD_ANIM_DURATION_SHORT, easeInElastic, 0); } // Inicializa los textos @@ -405,47 +405,47 @@ void Intro::initTexts() { auto writer = std::make_unique(Resource::get()->getText("04b_25_metal")); writer->setPosX(0); writer->setPosY(param.game.height - param.intro.text_distance_from_bottom); - writer->setKerning(-2); + writer->setKerning(TEXT_KERNING); writer->setEnabled(false); - writer->setFinishedCounter(180); + writer->setFinishedTimerMs(TEXT_DISPLAY_DURATION_MS); texts_.push_back(std::move(writer)); } // Un dia qualsevol de l'any 2000 texts_.at(0)->setCaption(Lang::getText("[INTRO] 1")); - texts_.at(0)->setSpeed(8); + texts_.at(0)->setSpeed(TEXT_SPEED_NORMAL); // Tot esta tranquil a la UPV texts_.at(1)->setCaption(Lang::getText("[INTRO] 2")); - texts_.at(1)->setSpeed(8); + texts_.at(1)->setSpeed(TEXT_SPEED_NORMAL); // Fins que un desaprensiu... texts_.at(2)->setCaption(Lang::getText("[INTRO] 3")); - texts_.at(2)->setSpeed(12); + texts_.at(2)->setSpeed(TEXT_SPEED_FAST); // HEY! ME ANE A FERME UN CORTAET... texts_.at(3)->setCaption(Lang::getText("[INTRO] 4")); - texts_.at(3)->setSpeed(8); + texts_.at(3)->setSpeed(TEXT_SPEED_NORMAL); // UAAAAAAAAAAAAA!!! texts_.at(4)->setCaption(Lang::getText("[INTRO] 5")); - texts_.at(4)->setSpeed(1); + texts_.at(4)->setSpeed(TEXT_SPEED_VERY_SLOW); // Espera un moment... texts_.at(5)->setCaption(Lang::getText("[INTRO] 6")); - texts_.at(5)->setSpeed(16); + texts_.at(5)->setSpeed(TEXT_SPEED_VERY_FAST); // Si resulta que no tinc solt! texts_.at(6)->setCaption(Lang::getText("[INTRO] 7")); - texts_.at(6)->setSpeed(2); + texts_.at(6)->setSpeed(TEXT_SPEED_SLOW); // MERDA DE MAQUINA! texts_.at(7)->setCaption(Lang::getText("[INTRO] 8")); - texts_.at(7)->setSpeed(3); + texts_.at(7)->setSpeed(TEXT_SPEED_MEDIUM_SLOW); // Blop... blop... blop... texts_.at(8)->setCaption(Lang::getText("[INTRO] 9")); - texts_.at(8)->setSpeed(20); + texts_.at(8)->setSpeed(TEXT_SPEED_ULTRA_FAST); for (auto &text : texts_) { text->center(param.game.game_area.center_x); @@ -489,8 +489,8 @@ void Intro::updatePostState() { switch (post_state_) { case PostState::STOP_BG: - // EVENTO: Detiene el fondo después de 1 segundo - if (ELAPSED_TIME >= 1000) { + // EVENTO: Detiene el fondo después del tiempo especificado + if (ELAPSED_TIME >= POST_BG_STOP_DELAY_MS) { tiled_bg_->stopGracefully(); if (!bg_color_.IS_EQUAL_TO(param.title.bg_color)) { @@ -508,8 +508,8 @@ void Intro::updatePostState() { break; case PostState::END: - // Finaliza la intro después de 1 segundo - if (ELAPSED_TIME >= 1000) { + // Finaliza la intro después del tiempo especificado + if (ELAPSED_TIME >= POST_END_DELAY_MS) { Audio::get()->stopMusic(); Section::name = Section::Name::TITLE; Section::options = Section::Options::TITLE_1; diff --git a/source/sections/intro.h b/source/sections/intro.h index b2a7f8e..02e47e8 100644 --- a/source/sections/intro.h +++ b/source/sections/intro.h @@ -11,9 +11,22 @@ #include "tiled_bg.h" // Para TiledBG #include "writer.h" // Para Writer -// --- Clase Intro: muestra la secuencia de introducción --- -// Esta clase gestiona un estado del programa. Se encarga de mostrar la secuencia -// de introducción. +// --- Clase Intro: secuencia cinemática de introducción del juego --- +// +// Esta clase gestiona la secuencia de introducción narrativa del juego, mostrando +// una serie de escenas con imágenes, texto y efectos visuales sincronizados. +// +// Funcionalidades principales: +// • Sistema de escenas secuencial: 6 escenas con transiciones automáticas +// • Animaciones de tarjetas: efectos de entrada con diferentes tipos de easing +// • Texto narrativo: velocidades de escritura configurables por escena +// • Efectos visuales: sombras, bordes y transiciones de color +// • Audio sincronizado: música de fondo durante toda la secuencia +// • Estado POST: transición suave hacia el menú principal +// +// Todas las duraciones y velocidades están configuradas mediante constantes +// para facilitar el ajuste fino de la experiencia cinematográfica. + class Intro { public: // --- Constructor y destructor --- @@ -24,6 +37,35 @@ class Intro { void run(); private: + // --- Constantes de tiempo (en milisegundos) --- + static constexpr float TEXT_DISPLAY_DURATION_MS = 3000.0f; // Duración de visualización de texto (180 frames a 60fps) + static constexpr Uint32 POST_BG_STOP_DELAY_MS = 1000; // Retraso antes de detener el fondo + static constexpr Uint32 POST_END_DELAY_MS = 1000; // Retraso antes de finalizar intro + + // --- Constantes de layout --- + static constexpr float CARD_BORDER_SIZE = 2.0f; // Tamaño del borde de tarjetas + static constexpr float SHADOW_OFFSET = 8.0f; // Desplazamiento de sombra + static constexpr int TEXT_KERNING = -2; // Espaciado entre caracteres + + // --- Constantes de velocidades de texto --- + static constexpr int TEXT_SPEED_NORMAL = 8; // Velocidad normal de escritura + static constexpr int TEXT_SPEED_FAST = 12; // Velocidad rápida + static constexpr int TEXT_SPEED_VERY_SLOW = 1; // Velocidad muy lenta (grito) + static constexpr int TEXT_SPEED_VERY_FAST = 16; // Velocidad muy rápida + static constexpr int TEXT_SPEED_SLOW = 2; // Velocidad lenta + static constexpr int TEXT_SPEED_MEDIUM_SLOW = 3; // Velocidad medio-lenta + static constexpr int TEXT_SPEED_ULTRA_FAST = 20; // Velocidad ultra rápida + + // --- Constantes de animaciones de tarjetas (duraciones en ms) --- + static constexpr int CARD_ANIM_DURATION_NORMAL = 100; // Duración estándar (100ms) + static constexpr int CARD_ANIM_DURATION_FAST = 40; // Duración rápida (40ms) + static constexpr int CARD_ANIM_DURATION_MEDIUM = 70; // Duración media (70ms) + static constexpr int CARD_ANIM_DURATION_SHORT = 80; // Duración corta (80ms) + static constexpr int CARD_ANIM_DURATION_SLOW = 250; // Duración lenta (250ms) + static constexpr int CARD_ANIM_DURATION_VERY_SLOW = 300; // Duración muy lenta (300ms) + static constexpr int CARD_ANIM_DELAY_LONG = 450; // Retraso largo antes de animación + static constexpr float CARD_OFFSET_MARGIN = 10.0f; // Margen fuera de pantalla + // --- Estados internos --- enum class State { SCENES, @@ -50,20 +92,20 @@ class Intro { Color bg_color_ = param.intro.bg_color; // Color de fondo // --- Métodos internos --- - void update(float delta_time); // Actualiza las variables del objeto - void render(); // Dibuja el objeto en pantalla - static void checkInput(); // Comprueba las entradas - static void checkEvents(); // Comprueba los eventos - void updateScenes(); // Actualiza las escenas de la intro - void initSprites(); // Inicializa las imágenes - void initTexts(); // Inicializa los textos - void updateSprites(float delta_time); // Actualiza los sprites - void updateTexts(float delta_time); // Actualiza los textos - void renderSprites(); // Dibuja los sprites - void renderTexts(); // Dibuja los textos - static void renderTextRect(); // Dibuja el rectangulo de fondo del texto; - void updatePostState(); // Actualiza el estado POST - float calculateDeltaTime(); // Calcula el tiempo transcurrido desde el último frame + void update(float delta_time); // Actualiza las variables del objeto + void render(); // Dibuja el objeto en pantalla + static void checkInput(); // Comprueba las entradas + static void checkEvents(); // Comprueba los eventos + void updateScenes(); // Actualiza las escenas de la intro + void initSprites(); // Inicializa las imágenes + void initTexts(); // Inicializa los textos + void updateSprites(float delta_time); // Actualiza los sprites + void updateTexts(float delta_time); // Actualiza los textos + void renderSprites(); // Dibuja los sprites + void renderTexts(); // Dibuja los textos + static void renderTextRect(); // Dibuja el rectangulo de fondo del texto; + void updatePostState(); // Actualiza el estado POST + float calculateDeltaTime(); // Calcula el tiempo transcurrido desde el último frame // --- Métodos para manejar cada escena individualmente --- void updateScene0(); diff --git a/source/writer.cpp b/source/writer.cpp index 49be3f4..c653809 100644 --- a/source/writer.cpp +++ b/source/writer.cpp @@ -70,11 +70,9 @@ auto Writer::isEnabled() const -> bool { return enabled_; } -// Establece el valor de la variable -void Writer::setFinishedCounter(int time) { - // Convierte frames a milisegundos (frames * 16.67ms) - constexpr float FRAME_TIME_MS = 1000.0f / 60.0f; - enabled_timer_target_ = static_cast(time) * FRAME_TIME_MS; +// Establece el temporizador para deshabilitar el objeto (en milisegundos) +void Writer::setFinishedTimerMs(float time_ms) { + enabled_timer_target_ = time_ms; enabled_timer_ = 0.0f; } diff --git a/source/writer.h b/source/writer.h index b0761a1..a79f4cf 100644 --- a/source/writer.h +++ b/source/writer.h @@ -25,7 +25,7 @@ class Writer { void setCaption(const std::string &text); // Establece el texto a escribir void setSpeed(int value); // Establece la velocidad de escritura void setEnabled(bool value); // Habilita o deshabilita el objeto - void setFinishedCounter(int time); // Establece el temporizador para deshabilitar el objeto + void setFinishedTimerMs(float time_ms); // Establece el temporizador para deshabilitar el objeto (en ms) void center(int x); // Centra la cadena de texto a un punto X