#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 segundos) --- static constexpr float TEXT_DISPLAY_DURATION_S = 3.0f; // Duración de visualización de texto (180 frames a 60fps) static constexpr float POST_BG_STOP_DELAY_S = 1.0f; // Retraso antes de detener el fondo static constexpr float POST_END_DELAY_S = 1.0f; // 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 float TILED_BG_SPEED = 18.0f; // Velocidad del fondo mosaico (pixels/segundo) static constexpr int TEXT_KERNING = -2; // Espaciado entre caracteres // --- Constantes de velocidades de texto (segundos entre caracteres) --- static constexpr float TEXT_SPEED_NORMAL = 0.133f; // Velocidad normal (8 frames * 16.67ms = 133ms) static constexpr float TEXT_SPEED_FAST = 0.2f; // Velocidad rápida (12 frames * 16.67ms = 200ms) static constexpr float TEXT_SPEED_VERY_SLOW = 0.0167f; // Velocidad muy lenta (1 frame * 16.67ms = 16.7ms) static constexpr float TEXT_SPEED_VERY_FAST = 0.267f; // Velocidad muy rápida (16 frames * 16.67ms = 267ms) static constexpr float TEXT_SPEED_SLOW = 0.033f; // Velocidad lenta (2 frames * 16.67ms = 33ms) static constexpr float TEXT_SPEED_MEDIUM_SLOW = 0.05f; // Velocidad medio-lenta (3 frames * 16.67ms = 50ms) static constexpr float TEXT_SPEED_ULTRA_FAST = 0.333f; // Velocidad ultra rápida (20 frames * 16.67ms = 333ms) // --- Constantes de animaciones de tarjetas (duraciones en segundos) --- static constexpr float CARD_ANIM_DURATION_NORMAL = 100.0f / 60.0f; // ≈ 1.6667 s static constexpr float CARD_ANIM_DURATION_FAST = 40.0f / 60.0f; // ≈ 0.6667 s static constexpr float CARD_ANIM_DURATION_MEDIUM = 70.0f / 60.0f; // ≈ 1.1667 s static constexpr float CARD_ANIM_DURATION_SHORT = 80.0f / 60.0f; // ≈ 1.3333 s static constexpr float CARD_ANIM_DURATION_SLOW = 250.0f / 60.0f; // ≈ 4.1667 s static constexpr float CARD_ANIM_DURATION_VERY_SLOW = 300.0f / 60.0f; // ≈ 5.0000 s static constexpr float CARD_ANIM_DELAY_LONG = 0.45f; // 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 float state_start_time_; // Tiempo de inicio del estado actual (segundos) 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); };