65 lines
2.1 KiB
C++
65 lines
2.1 KiB
C++
// firework_manager.hpp - Gestor de bursts radials (fireworks)
|
|
// © 2026 JailDesigner
|
|
|
|
#pragma once
|
|
|
|
#include <SDL3/SDL.h>
|
|
|
|
#include <array>
|
|
#include <functional>
|
|
#include <utility>
|
|
|
|
#include "core/defaults.hpp"
|
|
#include "core/rendering/render_context.hpp"
|
|
#include "core/types.hpp"
|
|
#include "firework.hpp"
|
|
|
|
namespace Effects {
|
|
|
|
// Pool de partícules. spawn() emet un burst d'N línies radials des
|
|
// d'`origen`. Cada partícula viu independent (update/draw/rebot).
|
|
class FireworkManager {
|
|
public:
|
|
// Notificació opcional cada vegada que es genera un burst.
|
|
using SpawnCallback = std::function<void(Vec2 origin)>;
|
|
|
|
explicit FireworkManager(Rendering::Renderer* renderer);
|
|
|
|
void setSpawnCallback(SpawnCallback callback) {
|
|
spawn_callback_ = std::move(callback);
|
|
}
|
|
|
|
// Emet un burst radial:
|
|
// origen: punt central del burst.
|
|
// color: color de les línies (heretat del pare).
|
|
// initial_speed: velocitat radial inicial (px/s).
|
|
// n_points: nombre de línies. Default Defaults::FX::Firework::N_POINTS.
|
|
// initial_brightness: 0..1.
|
|
// glow: si true, cada partícula es renderitza amb halo neon.
|
|
// glow_color: color del halo. Si alpha==0, agafa el color de la línia.
|
|
void spawn(const Vec2& origin,
|
|
SDL_Color color = Defaults::FX::Firework::DEFAULT_COLOR,
|
|
float initial_speed = Defaults::FX::Firework::SPEED,
|
|
int n_points = Defaults::FX::Firework::N_POINTS,
|
|
float initial_brightness = Defaults::FX::Firework::INITIAL_BRIGHTNESS,
|
|
bool glow = false,
|
|
SDL_Color glow_color = {0, 0, 0, 0});
|
|
|
|
void update(float delta_time);
|
|
void draw() const;
|
|
void reset();
|
|
|
|
[[nodiscard]] auto getActiveCount() const -> int;
|
|
|
|
private:
|
|
Rendering::Renderer* renderer_;
|
|
SpawnCallback spawn_callback_;
|
|
|
|
static constexpr int POOL_SIZE = Defaults::FX::Firework::POOL_SIZE;
|
|
std::array<Firework, POOL_SIZE> pool_;
|
|
|
|
auto findFreeSlot() -> Firework*;
|
|
};
|
|
|
|
} // namespace Effects
|