#pragma once #include // Para Uint32, Uint64 #include // Para unique_ptr #include // Para vector #include "color.h" // Para Color #include "param.h" // Para Param, ParamIntro, param #include "path_sprite.h" // Para PathSprite #include "tiled_bg.h" // Para TiledBG #include "writer.h" // Para Writer // --- 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 --- Intro(); ~Intro() = default; // --- Bucle principal --- 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, POST, }; enum class PostState { STOP_BG, END, }; // --- Objetos --- std::vector> card_sprites_; // Vector con los sprites inteligentes para los dibujos de la intro std::vector> shadow_sprites_; // Vector con los sprites inteligentes para las sombras std::vector> texts_; // Textos de la intro std::unique_ptr tiled_bg_; // Fondo en mosaico // --- Variables --- Uint64 last_time_ = 0; // Último timestamp para calcular delta-time int scene_ = 0; // Indica qué escena está activa State state_ = State::SCENES; // Estado principal de la intro PostState post_state_ = PostState::STOP_BG; // Estado POST Uint32 state_start_time_; // Tiempo de inicio del estado actual 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 // --- Métodos para manejar cada escena individualmente --- void updateScene0(); void updateScene1(); void updateScene2(); void updateScene3(); void updateScene4(); void updateScene5(); // --- Métodos auxiliares para reducir duplicación de código --- void enableCardAndShadow(int index); void switchText(int from_index, int to_index); };