// escena_titol.hpp - Pantalla de títol del joc // Mostra missatge "PRESS BUTTON TO PLAY" i copyright // © 2025 Port a C++20 #pragma once #include #include #include #include #include "core/defaults.hpp" #include "core/graphics/shape.hpp" #include "core/graphics/starfield.hpp" #include "core/graphics/vector_text.hpp" #include "core/input/input_types.hpp" #include "core/rendering/sdl_manager.hpp" #include "core/system/context_escenes.hpp" #include "core/system/game_config.hpp" #include "core/types.hpp" #include "game/title/ship_animator.hpp" // Botones para INICIAR PARTIDA desde MAIN (solo START) static constexpr std::array START_GAME_BUTTONS = { InputAction::START}; class EscenaTitol { public: explicit EscenaTitol(SDLManager& sdl, GestorEscenes::ContextEscenes& context); ~EscenaTitol(); // Destructor per aturar música void executar(); // Bucle principal de l'escena private: // Màquina d'estats per la pantalla de títol enum class EstatTitol { STARFIELD_FADE_IN, // Fade-in del starfield (3.0s) STARFIELD, // Pantalla amb camp d'estrelles (4.0s) MAIN, // Pantalla de títol amb text (indefinit, fins START) PLAYER_JOIN_PHASE, // Fase d'unió de jugadors: fade-out música + text parpellejant (2.5s) BLACK_SCREEN // Pantalla negra de transició (2.0s) }; // Estructura per emmagatzemar informació de cada lletra del títol struct LetraLogo { std::shared_ptr forma; // Forma vectorial de la lletra Punt posicio; // Posició en pantalla float ancho; // Amplada escalada float altura; // Altura escalada float offset_centre; // Offset del centre per posicionament }; SDLManager& sdl_; GestorEscenes::ContextEscenes& context_; GameConfig::ConfigPartida config_partida_; // Configuració de jugadors actius Graphics::VectorText text_; // Sistema de text vectorial std::unique_ptr starfield_; // Camp d'estrelles de fons std::unique_ptr ship_animator_; // Naus 3D flotants EstatTitol estat_actual_; // Estat actual de la màquina float temps_acumulat_; // Temps acumulat per l'estat INIT // Lletres del títol "ORNI ATTACK!" std::vector lletres_orni_; // Lletres de "ORNI" (línia 1) std::vector lletres_attack_; // Lletres de "ATTACK!" (línia 2) float y_attack_dinamica_; // Posició Y calculada dinàmicament per "ATTACK!" // Estat d'animació del logo float temps_animacio_; // Temps acumulat per animació orbital std::vector posicions_originals_orni_; // Posicions originals de "ORNI" std::vector posicions_originals_attack_; // Posicions originals de "ATTACK!" // Estat d'arrencada de l'animació float temps_estat_main_; // Temps acumulat en estat MAIN bool animacio_activa_; // Flag: true quan animació està activa float factor_lerp_; // Factor de lerp actual (0.0 → 1.0) // Constants static constexpr float BRIGHTNESS_STARFIELD = 1.2f; // Brightness del starfield (>1.0 = més brillant) static constexpr float DURACIO_FADE_IN = 3.0f; // Duració del fade-in del starfield (1.5 segons) static constexpr float DURACIO_INIT = 4.0f; // Duració de l'estat INIT (2 segons) static constexpr float DURACIO_TRANSITION = 2.5f; // Duració de la transició (1.5 segons) static constexpr float ESPAI_ENTRE_LLETRES = 10.0f; // Espai entre lletres static constexpr float BLINK_FREQUENCY = 3.0f; // Freqüència de parpelleig (3 Hz) static constexpr float DURACIO_BLACK_SCREEN = 2.0f; // Duració pantalla negra (2 segons) static constexpr int MUSIC_FADE = 1500; // Duracio del fade de la musica del titol al començar a jugar // Constants d'animació del logo static constexpr float ORBIT_AMPLITUDE_X = 4.0f; // Amplitud oscil·lació horitzontal (píxels) static constexpr float ORBIT_AMPLITUDE_Y = 3.0f; // Amplitud oscil·lació vertical (píxels) static constexpr float ORBIT_FREQUENCY_X = 0.8f; // Velocitat oscil·lació horitzontal (Hz) static constexpr float ORBIT_FREQUENCY_Y = 1.2f; // Velocitat oscil·lació vertical (Hz) static constexpr float ORBIT_PHASE_OFFSET = 1.57f; // Desfasament entre X i Y (90° per circular) // Constants d'ombra del logo static constexpr float SHADOW_DELAY = 0.5f; // Retard temporal de l'ombra (segons) static constexpr float SHADOW_BRIGHTNESS = 0.4f; // Multiplicador de brillantor de l'ombra (0.0-1.0) static constexpr float SHADOW_OFFSET_X = 2.0f; // Offset espacial X fix (píxels) static constexpr float SHADOW_OFFSET_Y = 2.0f; // Offset espacial Y fix (píxels) // Temporització de l'arrencada de l'animació static constexpr float DELAY_INICI_ANIMACIO = 10.0f; // 10s estàtic abans d'animar static constexpr float DURACIO_LERP = 2.0f; // 2s per arribar a amplitud completa // Mètodes privats void actualitzar(float delta_time); void actualitzar_animacio_logo(float delta_time); // Actualitza l'animació orbital del logo void dibuixar(); void processar_events(const SDL_Event& event); auto checkSkipButtonPressed() -> bool; auto checkStartGameButtonPressed() -> bool; void inicialitzar_titol(); // Carrega i posiciona les lletres del títol };