60 lines
1.9 KiB
C++
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
|