// trail_manager.hpp - Estela de partícules daurades darrere la nau // © 2026 JailDesigner #pragma once #include #include #include #include #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& 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 star_shape_; std::array pool_{}; std::array emit_cooldown_{0.0F, 0.0F}; float time_accumulator_{0.0F}; }; } // namespace Effects