80 lines
4.4 KiB
C++
80 lines
4.4 KiB
C++
#pragma once
|
|
|
|
#include <SDL3/SDL.h> // Para SDL_FRect, Uint16
|
|
|
|
#include <memory> // Para shared_ptr, unique_ptr
|
|
#include <string> // Para string
|
|
#include <vector> // Para vector
|
|
|
|
#include "animated_sprite.h" // Para AnimatedSprite
|
|
#include "utils.h" // Para Circle
|
|
|
|
class Texture;
|
|
|
|
// --- Enums ---
|
|
enum class ItemType : int {
|
|
DISK = 1, // Disco
|
|
GAVINA = 2, // Gavina
|
|
PACMAR = 3, // Pacman
|
|
CLOCK = 4, // Reloj
|
|
COFFEE = 5, // Café
|
|
DEBIAN = 6, // Debian
|
|
COFFEE_MACHINE = 7, // Máquina de café
|
|
NONE = 8, // Ninguno
|
|
};
|
|
|
|
// --- Clase Item: representa un objeto en el juego ---
|
|
class Item {
|
|
public:
|
|
// --- Constantes ---
|
|
static constexpr int COFFEE_MACHINE_WIDTH = 30; // Anchura de la máquina de café
|
|
static constexpr int COFFEE_MACHINE_HEIGHT = 39; // Altura de la máquina de café
|
|
|
|
// --- Constructor y destructor ---
|
|
Item(ItemType type, float x, float y, SDL_FRect &play_area, const std::shared_ptr<Texture> &texture, const std::vector<std::string> &animation); // Constructor principal
|
|
~Item() = default; // Destructor
|
|
|
|
// --- Métodos principales ---
|
|
void alignTo(int x); // Centra el objeto en la posición X indicada
|
|
void render(); // Renderiza el objeto en pantalla
|
|
void disable(); // Desactiva el objeto
|
|
void update(); // Actualiza la posición, animación y contadores
|
|
|
|
// --- Getters ---
|
|
[[nodiscard]] auto getPosX() const -> float { return pos_x_; } // Obtiene la posición X
|
|
[[nodiscard]] auto getPosY() const -> float { return pos_y_; } // Obtiene la posición Y
|
|
[[nodiscard]] auto getWidth() const -> int { return width_; } // Obtiene la anchura
|
|
[[nodiscard]] auto getHeight() const -> int { return height_; } // Obtiene la altura
|
|
[[nodiscard]] auto getType() const -> ItemType { return type_; } // Obtiene el tipo
|
|
[[nodiscard]] auto isEnabled() const -> bool { return enabled_; } // Verifica si está habilitado
|
|
[[nodiscard]] auto isOnFloor() const -> bool { return floor_collision_; } // Verifica si está en el suelo
|
|
auto getCollider() -> Circle & { return collider_; } // Obtiene el colisionador
|
|
|
|
private:
|
|
// --- Objetos y punteros ---
|
|
std::unique_ptr<AnimatedSprite> sprite_; // Sprite con los gráficos del objeto
|
|
|
|
// --- Variables de estado ---
|
|
SDL_FRect play_area_; // Rectángulo con la zona de juego
|
|
Circle collider_; // Círculo de colisión del objeto
|
|
ItemType type_; // Tipo de objeto
|
|
float pos_x_; // Posición X del objeto
|
|
float pos_y_; // Posición Y del objeto
|
|
float vel_x_; // Velocidad en el eje X
|
|
float vel_y_; // Velocidad en el eje Y
|
|
float accel_x_ = 0.0F; // Aceleración en el eje X
|
|
float accel_y_; // Aceleración en el eje Y
|
|
int width_; // Ancho del objeto
|
|
int height_; // Alto del objeto
|
|
Uint16 time_to_live_ = 600; // Tiempo que el objeto está presente
|
|
bool floor_collision_ = false; // Indica si el objeto colisiona con el suelo
|
|
bool enabled_ = true; // Indica si el objeto está habilitado
|
|
|
|
// --- Métodos internos ---
|
|
void shiftColliders(); // Alinea el círculo de colisión con la posición del objeto
|
|
void shiftSprite(); // Coloca el sprite en la posición del objeto
|
|
void move(); // Actualiza la posición y estados del objeto
|
|
void updateTimeToLive(); // Actualiza el contador de tiempo de vida
|
|
static auto getCoffeeMachineSpawn(int player_x, int item_width, int area_width, int margin = 2) -> int; // Calcula la zona de aparición de la máquina de café
|
|
};
|