// 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 disparar(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 esta_; } // 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 esta_ && grace_timer_ <= 0.0F; } // Getters (API pública sin cambios) [[nodiscard]] auto esta_activa() const -> bool { return esta_; } [[nodiscard]] auto getOwnerId() const -> uint8_t { return owner_id_; } [[nodiscard]] auto getGraceTimer() const -> float { return grace_timer_; } 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, sin grace timer). bool esta_{false}; uint8_t owner_id_{0}; // 0=P1, 1=P2 float grace_timer_{0.0F}; // Grace period timer (0.0 = vulnerable) };