#pragma once #include // Para SDL_FRect, Uint16 #include // Para shared_ptr, unique_ptr #include // Para string #include // 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, std::shared_ptr texture, const std::vector &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 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é };