// bullet.hpp - Clase para projectils de la ship // © 2026 JailDesigner #pragma once #include #include #include "core/defaults.hpp" #include "core/entities/entity.hpp" #include "core/types.hpp" class Bullet : public Entities::Entity { public: Bullet() : Entity(nullptr) {} explicit Bullet(Rendering::Renderer* renderer); void init() override; void fire(const Vec2& position, float angle, uint8_t owner_id); void update(float delta_time) override; void postUpdate(float delta_time) override; void draw() const override; // Override: Interfaz de Entity [[nodiscard]] auto isActive() const -> bool override { return is_active_; } // Override: Interfaz de colisión (gameplay-level: PLAYAREA bounds-check) [[nodiscard]] auto getCollisionRadius() const -> float override { return Defaults::Entities::BULLET_RADIUS; } [[nodiscard]] auto isCollidable() const -> bool override { return is_active_; } // Getters (API pública sin cambios) [[nodiscard]] auto getOwnerId() const -> uint8_t { return owner_id_; } // Posició al final del frame anterior, per a CCD segment-vs-cercle. [[nodiscard]] auto getPrevPosition() const -> const Vec2& { return prev_position_; } void desactivar(); private: // Miembros específicos de Bullet (heredados: renderer_, shape_, center_, angle_, brightness_, body_). // Inicializados en la declaración para que tanto el ctor por defecto como el que toma renderer // dejen el objeto en estado coherente (proyectil inactivo, sin owner). bool is_active_{false}; uint8_t owner_id_{0}; // 0=P1, 1=P2 Vec2 prev_position_{}; // Posició al final del frame anterior (per a swept collision) };