Files

60 lines
1.9 KiB
C++

// trail_manager.hpp - Estela de partícules daurades darrere la nau
// © 2026 JailDesigner
#pragma once
#include <SDL3/SDL.h>
#include <array>
#include <cstdint>
#include <memory>
#include "core/defaults/trail.hpp"
#include "core/graphics/shape.hpp"
#include "core/rendering/render_context.hpp"
#include "core/types.hpp"
#include "game/entities/ship.hpp"
namespace Effects {
// Manté un pool fixe de partícules amb forma d'estrella (star.shp) que
// pulsen entre groc i daurat, oscil·len al voltant del seu naixement i
// encongeixen fins a desaparèixer. Les naus actives emeten quan superen
// SPEED_THRESHOLD_PX_S.
class TrailManager {
public:
explicit TrailManager(Rendering::Renderer* renderer);
void update(float delta_time, const std::array<Ship, 2>& ships);
void draw() const;
void reset();
[[nodiscard]] auto getActiveCount() const -> int;
private:
struct Particle {
bool active{false};
std::uint8_t player_id{0}; // 0=P1, 1=P2 — selecciona paleta de colors
Vec2 origin{}; // punt de naixement (no es desplaça)
float phase_x{0.0F}; // fase oscil·lació horitzontal
float phase_y{0.0F};
float phase_pulse{0.0F};
float age{0.0F};
float lifetime{0.0F};
float scale{1.0F};
};
void tryEmitFromShip(const Ship& ship, std::uint8_t player_id, float delta_time);
void emitAt(Vec2 pos, std::uint8_t player_id);
auto findFreeSlot() -> int;
void drawParticle(const Particle& particle) const;
Rendering::Renderer* renderer_;
std::shared_ptr<Graphics::Shape> star_shape_;
std::array<Particle, Defaults::Trail::POOL_SIZE> pool_{};
std::array<float, 2> emit_cooldown_{0.0F, 0.0F};
float time_accumulator_{0.0F};
};
} // namespace Effects