// escena_logo.hpp - Pantalla d'inici del joc // Mostra logo JAILGAMES animat amb zoom i salta al joc // © 2025 Port a C++20 #pragma once #include #include #include #include #include "core/defaults.hpp" #include "core/graphics/shape.hpp" #include "core/input/input_types.hpp" #include "core/rendering/sdl_manager.hpp" #include "core/system/context_escenes.hpp" #include "core/types.hpp" #include "game/effects/debris_manager.hpp" class EscenaLogo { public: explicit EscenaLogo(SDLManager& sdl, GestorEscenes::ContextEscenes& context); ~EscenaLogo(); // Destructor per aturar sons void executar(); // Bucle principal de l'escena private: // Màquina d'estats per l'animació enum class EstatAnimacio { PRE_ANIMATION, // Pantalla negra inicial ANIMATION, // Animació de zoom de lletres POST_ANIMATION, // Logo complet visible EXPLOSION, // Explosió seqüencial de lletres POST_EXPLOSION // Espera després de l'última explosió }; SDLManager& sdl_; GestorEscenes::ContextEscenes& context_; EstatAnimacio estat_actual_; // Estat actual de la màquina float temps_estat_actual_; // Temps en l'estat actual (reset en cada transició) // Gestor de fragments d'explosions std::unique_ptr debris_manager_; // Seguiment d'explosions seqüencials size_t lletra_explosio_index_; // Índex de la següent lletra a explotar float temps_des_ultima_explosio_; // Temps des de l'última explosió std::vector ordre_explosio_; // Ordre aleatori d'índexs de lletres // Estructura per a cada lletra del logo struct LetraLogo { std::shared_ptr forma; Punt posicio; // Posició final en pantalla float ancho; // Ancho del bounding box float offset_centre; // Distància de min_x a shape_centre.x }; std::vector lletres_; // 9 lletres: J-A-I-L-G-A-M-E-S // Seguiment de sons de lletres (evitar reproduccions repetides) std::array so_reproduit_; // Track si cada lletra ja ha reproduit el so // Constants d'animació static constexpr float DURACIO_PRE = 1.5F; // Duració PRE_ANIMATION (pantalla negra) static constexpr float DURACIO_ZOOM = 4.0F; // Duració del zoom (segons) static constexpr float DURACIO_POST_ANIMATION = 3.0F; // Duració POST_ANIMATION (logo complet) static constexpr float DURACIO_POST_EXPLOSION = 3.0F; // Duració POST_EXPLOSION (espera final) static constexpr float DELAY_ENTRE_EXPLOSIONS = 0.1F; // Temps entre explosions de lletres static constexpr float VELOCITAT_EXPLOSIO = 240.0F; // Velocitat base fragments (px/s) static constexpr float ESCALA_INICIAL = 0.1F; // Escala inicial (10%) static constexpr float ESCALA_FINAL = 0.8F; // Escala final (80%) static constexpr float ESPAI_ENTRE_LLETRES = 10.0F; // Espaiat entre lletres // Constants d'animació seqüencial static constexpr float THRESHOLD_LETRA = 0.6F; // Umbral per activar següent lletra (0.0-1.0) static constexpr float ORIGEN_ZOOM_X = Defaults::Game::WIDTH * 0.5F; // Punt inicial X del zoom static constexpr float ORIGEN_ZOOM_Y = Defaults::Game::HEIGHT * 0.4F; // Punt inicial Y del zoom // Mètodes privats void inicialitzar_lletres(); void actualitzar(float delta_time); void actualitzar_explosions(float delta_time); void dibuixar(); void processar_events(const SDL_Event& event); auto checkSkipButtonPressed() -> bool; // Mètodes de gestió d'estats void canviar_estat(EstatAnimacio nou_estat); bool totes_lletres_completes() const; };