88 lines
3.8 KiB
C++
88 lines
3.8 KiB
C++
// 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 <SDL3/SDL.h>
|
|
|
|
#include <memory>
|
|
#include <vector>
|
|
|
|
#include "game/effects/debris_manager.hpp"
|
|
#include "core/defaults.hpp"
|
|
#include "core/graphics/shape.hpp"
|
|
#include "core/rendering/sdl_manager.hpp"
|
|
#include "core/system/context_escenes.hpp"
|
|
#include "core/types.hpp"
|
|
|
|
class EscenaLogo {
|
|
public:
|
|
explicit EscenaLogo(SDLManager& sdl, GestorEscenes::ContextEscenes& context);
|
|
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<Effects::DebrisManager> 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<size_t> ordre_explosio_; // Ordre aleatori d'índexs de lletres
|
|
|
|
// Estructura per a cada lletra del logo
|
|
struct LetraLogo {
|
|
std::shared_ptr<Graphics::Shape> 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<LetraLogo> lletres_; // 9 lletres: J-A-I-L-G-A-M-E-S
|
|
|
|
// Seguiment de sons de lletres (evitar reproduccions repetides)
|
|
std::array<bool, 9> 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);
|
|
|
|
// Mètodes de gestió d'estats
|
|
void canviar_estat(EstatAnimacio nou_estat);
|
|
bool totes_lletres_completes() const;
|
|
};
|