// ship_animator.hpp - Sistema d'animació de naus per a l'escena de títol // © 2025 Port a C++20 amb SDL3 #pragma once #include #include #include #include "core/graphics/shape.hpp" #include "core/types.hpp" namespace Title { // Estats de l'animació de la ship enum class ShipState { ENTERING, // Entrant des de fora de pantalla FLOATING, // Flotant en posició estàtica EXITING // Volant cap al point de fuga }; // Dades d'una ship individual al títol struct TitleShip { // Identificació int player_id; // 1 o 2 // Estat ShipState state; float state_time; // Temps acumulat en l'state actual // Posicions Vec2 initial_position; // Posició d'inici (fora de pantalla per ENTERING) Vec2 target_position; // Posició objectiu (rellotge 8 o 4) Vec2 current_position; // Posició interpolada actual // Escales (simulació eix Z) float initial_scale; // Escala d'inici (més gran = més a prop) float target_scale; // Escala objectiu (mida flotació) float current_scale; // Escala interpolada actual // Flotació float oscillation_phase; // Acumulador de fase per moviment sinusoïdal // Paràmetres d'entrada float entry_delay; // Delay abans d'entrar (0.0 per P1, 0.5 per P2) // Paràmetres d'oscil·lació per ship float amplitude_x; float amplitude_y; float frequency_x; float frequency_y; // Forma std::shared_ptr shape; // Visibilitat bool visible; }; // Gestor d'animació de naus per a l'escena de títol class ShipAnimator { public: explicit ShipAnimator(SDL_Renderer* renderer); // Cicle de vida void init(); void update(float delta_time); void draw() const; // Control d'state (cridat per TitleScene) void start_entry_animation(); void trigger_exit_animation(); // Anima totes les naus void trigger_exit_animation_for_player(int player_id); // Anima només una ship (P1=1, P2=2) void skip_to_floating_state(); // Salta directament a FLOATING sense animació // Control de visibilitat void set_visible(bool visible); [[nodiscard]] bool is_animation_complete() const; [[nodiscard]] bool is_visible() const; // Comprova si alguna ship és visible private: SDL_Renderer* renderer_; std::array ships_; // Naus P1 i P2 // Mètodes d'animació void actualitzar_entering(TitleShip& ship, float delta_time); void actualitzar_floating(TitleShip& ship, float delta_time); void actualitzar_exiting(TitleShip& ship, float delta_time); // Configuració void configurar_nau_p1(TitleShip& ship); void configurar_nau_p2(TitleShip& ship); [[nodiscard]] Vec2 calcular_posicio_fora_pantalla(float angle_rellotge) const; }; } // namespace Title