// debris_manager.hpp - Gestor de fragments d'explosions // © 2025 Port a C++20 amb SDL3 #pragma once #include #include #include #include "core/graphics/shape.hpp" #include "core/types.hpp" #include "debris.hpp" namespace Effects { // Gestor de fragments d'explosions // Manté un pool d'objectes Debris i gestiona el seu cicle de vida class DebrisManager { public: explicit DebrisManager(SDL_Renderer* renderer); // Crear explosió a partir d'una forma // - shape: forma vectorial a explotar // - centre: posició del centre de l'objecte // - angle: orientació de l'objecte (radians) // - escala: escala de l'objecte (1.0 = normal) // - velocitat_base: velocitat inicial dels fragments (px/s) // - brightness: factor de brillantor heretat (0.0-1.0, per defecte 1.0) // - velocitat_objecte: velocitat de l'objecte que explota (px/s, per defecte 0) // - velocitat_angular: velocitat angular heretada (rad/s, per defecte 0) // - factor_herencia_visual: factor de herència rotació visual (0.0-1.0, per defecte 0.0) void explotar(const std::shared_ptr& shape, const Punt& centre, float angle, float escala, float velocitat_base, float brightness = 1.0f, const Punt& velocitat_objecte = {0.0f, 0.0f}, float velocitat_angular = 0.0f, float factor_herencia_visual = 0.0f, const std::string& sound = Defaults::Sound::EXPLOSION); // Actualitzar tots els fragments actius void actualitzar(float delta_time); // Dibuixar tots els fragments actius void dibuixar() const; // Reiniciar tots els fragments (neteja) void reiniciar(); // Obtenir número de fragments actius int get_num_actius() const; private: SDL_Renderer* renderer_; // Pool de fragments (màxim concurrent) // Un pentàgon té 5 línies, 15 enemics = 75 línies // + nau (3 línies) + bales (5 línies * 3) = 93 línies màxim // Arrodonit a 100 per seguretat static constexpr int MAX_DEBRIS = 100; std::array debris_pool_; // Trobar primer slot inactiu Debris* trobar_slot_lliure(); // Calcular direcció d'explosió (radial, des del centre cap al segment) Punt calcular_direccio_explosio(const Punt& p1, const Punt& p2, const Punt& centre_objecte) const; }; } // namespace Effects