Files
orni_attack/source/game/effects/debris_manager.hpp
2025-12-02 08:30:32 +01:00

60 lines
1.7 KiB
C++

// debris_manager.hpp - Gestor de fragments d'explosions
// © 2025 Port a C++20 amb SDL3
#pragma once
#include "debris.hpp"
#include "core/graphics/shape.hpp"
#include "core/types.hpp"
#include <SDL3/SDL.h>
#include <array>
#include <memory>
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<Graphics::Shape> &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, MAX_DEBRIS> 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