// debris_manager.hpp - Gestor de fragments de explosions // © 2026 JailDesigner #pragma once #include "core/rendering/render_context.hpp" #include #include #include #include "core/defaults.hpp" #include "core/graphics/shape.hpp" #include "core/types.hpp" #include "debris.hpp" namespace Effects { // Gestor de fragments de explosions // Manté un pool de objectes Debris i gestiona el seu cicle de vida class DebrisManager { public: explicit DebrisManager(Rendering::Renderer* renderer); // Crear explosión a partir de una shape // - shape: shape vectorial a explode // - centro: posición del centro de l'objecte // - angle: orientació de l'objecte (radians) // - scale: scale de l'objecte (1.0 = normal) // - velocitat_base: velocity inicial dels fragments (px/s) // - brightness: factor de brightness heretat (0.0-1.0, per defecte 1.0) // - velocitat_objecte: velocity de l'objecte que explota (px/s, per defecte 0) // - velocitat_angular: velocity angular heretada (rad/s, per defecte 0) // - factor_herencia_visual: factor de herència rotación visual (0.0-1.0, per defecte 0.0) void explode(const std::shared_ptr& shape, const Vec2& centro, float angle, float scale, float velocitat_base, float brightness = 1.0F, const Vec2& velocitat_objecte = {.x = 0.0F, .y = 0.0F}, float velocitat_angular = 0.0F, float factor_herencia_visual = 0.0F, const std::string& sound = Defaults::Sound::EXPLOSION, SDL_Color color = {0, 0, 0, 0}); // alpha==0 → fragmentos usan oscilador global // Actualitzar todos los fragments active void update(float delta_time); // Dibuixar todos los fragments active void draw() const; // Reiniciar todos los fragments (clear) void reset(); // Obtenir número de fragments active [[nodiscard]] int getActiveCount() const; private: Rendering::Renderer* renderer_; // Pool de fragments (màxim concurrent) // Un pentágono té 5 línies, 15 enemigos = 75 línies // + ship (3 línies) + balas (5 línies * 3) = 93 línies màxim // Arrodonit a 100 per seguretat static constexpr int MAX_DEBRIS = 150; std::array debris_pool_; // Trobar primer slot inactiu Debris* findFreeSlot(); // Calcular direcció de explosión (radial, des del centro hacia el segment) [[nodiscard]] Vec2 computeExplosionDirection(const Vec2& p1, const Vec2& p2, const Vec2& centre_objecte) const; }; } // namespace Effects