// ship.hpp - Clase para la nave del player // © 1999 Visente i Sergi (versión Pascal) // © 2025 Port a C++20 con SDL3 #pragma once #include #include #include #include "core/defaults.hpp" #include "core/entities/entity.hpp" #include "core/types.hpp" #include "game/constants.hpp" class Ship : public Entities::Entity { public: Ship() : Entity(nullptr) {} Ship(SDL_Renderer* renderer, const char* shape_file = "ship.shp"); void init() override { init(nullptr, false); } void init(const Vec2* spawn_point, bool activar_invulnerabilitat = false); void processInput(float delta_time, uint8_t player_id); void update(float delta_time) override; void draw() const override; // Override: Interfície d'Entity [[nodiscard]] bool isActive() const override { return !is_hit_; } // Override: Interfície de colisión [[nodiscard]] float getCollisionRadius() const override { return Defaults::Entities::SHIP_RADIUS; } [[nodiscard]] bool isCollidable() const override { return !is_hit_ && invulnerable_timer_ <= 0.0F; } // Getters (API pública sin canvis) [[nodiscard]] bool isAlive() const { return !is_hit_; } [[nodiscard]] bool isHit() const { return is_hit_; } [[nodiscard]] bool isInvulnerable() const { return invulnerable_timer_ > 0.0F; } [[nodiscard]] Vec2 getVelocityVector() const { return { .x = velocity_ * std::cos(angle_ - (Constants::PI / 2.0F)), .y = velocity_ * std::sin(angle_ - (Constants::PI / 2.0F))}; } // Setters void setCenter(const Vec2& nou_centre) { center_ = nou_centre; } // Colisiones (Fase 10) void markHit() { is_hit_ = true; } private: // Membres específics de Ship (heretats: renderer_, shape_, center_, angle_, brightness_) float velocity_; // Velocidad (px/s) bool is_hit_; float invulnerable_timer_; // 0.0f = vulnerable, >0.0f = invulnerable void applyPhysics(float delta_time); };