#pragma once #include #include // for uint8_t #include "utils/utils.h" // for circle_t class Sprite; class Texture; // Tipus de bala. Enum class fortament tipat per evitar confusió accidental // amb altres `int`/`Uint8` (p.ex. el `owner` a `createBullet`). enum class BulletKind : std::uint8_t { NONE = 0, // bala desactivada / fora de pantalla UP = 1, LEFT = 2, RIGHT = 3, }; // Tipos de retorno de la función move de la bala constexpr int BULLET_MOVE_OK = 0; constexpr int BULLET_MOVE_OUT = 1; // Clase Bullet class Bullet { private: // Objetos y punteros Sprite *sprite; // Sprite con los graficos y métodos de pintado // Variables int posX; // Posición en el eje X int posY; // Posición en el eje Y Uint8 width; // Ancho del objeto Uint8 height; // Alto del objeto int velX; // Velocidad en el eje X int velY; // Velocidad en el eje Y BulletKind kind; // Tipo de objeto int owner; // Identificador del dueño del objeto circle_t collider; // Circulo de colisión del objeto // Alinea el circulo de colisión con el objeto void shiftColliders(); public: // Constructor Bullet(int x, int y, BulletKind kind, bool poweredUp, int owner, Texture *texture, SDL_Renderer *renderer); // Destructor ~Bullet(); Bullet(const Bullet &) = delete; auto operator=(const Bullet &) -> Bullet & = delete; // Pinta el objeto en pantalla void render(); // Actualiza la posición y estado del objeto auto move() -> Uint8; // Comprueba si el objeto está habilitado [[nodiscard]] auto isEnabled() const -> bool; // Deshabilita el objeto void disable(); // Obtiene el valor de la variable [[nodiscard]] auto getPosX() const -> int; // Obtiene el valor de la variable [[nodiscard]] auto getPosY() const -> int; // Establece el valor de la variable void setPosX(int x); // Establece el valor de la variable void setPosY(int y); // Obtiene el valor de la variable [[nodiscard]] auto getVelY() const -> int; // Obtiene el valor de la variable [[nodiscard]] auto getKind() const -> BulletKind; // Obtiene el valor de la variable [[nodiscard]] auto getOwner() const -> int; // Obtiene el circulo de colisión auto getCollider() -> circle_t &; };