#pragma once #include #include // for uint8_t #include "utils/utils.h" // for Circle class Sprite; class Texture; // Clase Bullet class Bullet { public: // Tipus de bala. Enum class fortament tipat per evitar confusió accidental // amb altres `int`/`Uint8` (p.ex. el `owner` a `createBullet`). enum class Kind : std::uint8_t { NONE = 0, // bala desactivada / fora de pantalla UP = 1, LEFT = 2, RIGHT = 3, }; // Resultado de Bullet::move() enum class MoveResult : std::uint8_t { OK = 0, OUT = 1, }; Bullet(int x, int y, Kind kind, bool powered_up, int owner, Texture *texture, SDL_Renderer *renderer); // Constructor ~Bullet(); // Destructor Bullet(const Bullet &) = delete; auto operator=(const Bullet &) -> Bullet & = delete; void render(); // Pinta el objeto en pantalla auto move() -> MoveResult; // Actualiza la posición y estado del objeto (frame-based) auto move(float dt_s) -> MoveResult; // Actualiza la posición y estado del objeto (time-based) void disable(); // Deshabilita el objeto [[nodiscard]] auto isEnabled() const -> bool; // Comprueba si el objeto está habilitado [[nodiscard]] auto getPosX() const -> int; // Obtiene el valor de la variable [[nodiscard]] auto getPosY() const -> int; // Obtiene el valor de la variable [[nodiscard]] auto getVelY() const -> int; // Obtiene el valor de la variable [[nodiscard]] auto getKind() const -> Kind; // Obtiene el valor de la variable [[nodiscard]] auto getOwner() const -> int; // Obtiene el valor de la variable void setPosX(int x); // Establece el valor de la variable void setPosY(int y); // Establece el valor de la variable auto getCollider() -> Circle &; // Obtiene el circulo de colisión private: // Velocidades time-based (px/s). Derivades de les antigues px/frame * 60. static constexpr float VEL_Y_PX_PER_S = -180.0F; // Era -3 px/frame static constexpr float VEL_X_LEFT_PX_PER_S = -120.0F; // Era -2 px/frame static constexpr float VEL_X_RIGHT_PX_PER_S = 120.0F; // Era +2 px/frame // Objetos y punteros Sprite *sprite_; // Sprite con los graficos y métodos de pintado // Variables int pos_x_; // Posición en el eje X (px enters per al sprite/collider) int pos_y_; // Posición en el eje Y float pos_x_f_{0}; // Acumulador subpíxel per al moviment time-based float pos_y_f_{0}; // Acumulador subpíxel per al moviment time-based Uint8 width_; // Ancho del objeto Uint8 height_; // Alto del objeto int vel_x_; // Velocidad en el eje X (frame-based: px/frame) int vel_y_; // Velocidad en el eje Y (frame-based: px/frame) float vel_x_s_{0}; // Velocidad en el eje X (time-based: px/s) float vel_y_s_{0}; // Velocidad en el eje Y (time-based: px/s) Kind kind_; // Tipo de objeto int owner_; // Identificador del dueño del objeto Circle collider_; // Circulo de colisión del objeto void shiftColliders(); // Alinea el circulo de colisión con el objeto };