// 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) void explotar(const std::shared_ptr& shape, const Punt& centre, float angle, float escala, float velocitat_base); // 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ó perpendicular a un segment Punt calcular_direccio_perpendicular(const Punt& p1, const Punt& p2) const; }; } // namespace Effects