#pragma once #include // para SDL_Rect #include // para Uint16 #include // para shared_ptr, unique_ptr #include // para string #include // para vector #include "animated_sprite.h" // para SpriteAnimated #include "utils.h" // para Circle class Texture; /** * @brief Tipos de objetos disponibles en el juego. * * Esta enumeración define los diferentes tipos de objetos que pueden existir en el juego, * cada uno con un identificador único. */ enum class ItemType : int { DISK = 1, /**< Disco */ GAVINA = 2, /**< Gavina */ PACMAR = 3, /**< Pacman */ CLOCK = 4, /**< Reloj */ COFFEE = 5, /**< Café */ COFFEE_MACHINE = 6,/**< Máquina de café */ NONE = 7, /**< Ninguno */ }; /** * @brief Clase Item. * * Esta clase representa un objeto en el juego, con sus propiedades y métodos para gestionar su comportamiento. */ class Item { private: // Objetos y punteros std::unique_ptr sprite_; /**< Sprite con los gráficos del objeto */ // Variables float pos_x_; /**< Posición X del objeto */ float pos_y_; /**< Posición Y del objeto */ int width_; /**< Ancho del objeto */ int height_; /**< Alto 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 */ bool floor_collision_ = false; /**< Indica si el objeto colisiona con el suelo */ ItemType type_; /**< Especifica el tipo de objeto que es */ bool enabled_ = true; /**< Especifica si el objeto está habilitado */ Circle collider_; /**< Círculo de colisión del objeto */ SDL_Rect play_area_; /**< Rectángulo con la zona de juego */ Uint16 time_to_live_ = 600; /**< Temporizador con el tiempo que el objeto está presente */ /** * @brief Alinea el círculo de colisión con la posición del objeto. * * Esta función ajusta la posición del círculo de colisión para que coincida con la posición del objeto. * Actualiza las coordenadas X e Y del colisionador basándose en las coordenadas del objeto. */ void shiftColliders(); /** * @brief Coloca el sprite en la posición del objeto. * * Esta función ajusta la posición del sprite para que coincida con la posición del objeto. * Actualiza las coordenadas X e Y del sprite basándose en las coordenadas del objeto. */ void shiftSprite(); /** * @brief Actualiza la posición y estados del objeto. * * Esta función actualiza la posición del objeto basándose en su velocidad y aceleración. * Controla las colisiones con los límites del área de juego, ajustando la posición y la velocidad en consecuencia. * También actualiza la posición del sprite y el colisionador del objeto. */ void move(); /** * @brief Actualiza el contador de tiempo de vida del objeto. * * Esta función decrementa el contador de tiempo de vida del objeto. * Si el tiempo de vida es mayor a 0, se decrementa en 1. * Si el tiempo de vida es 0 o menos, se desactiva el objeto llamando a la función `disable()`. */ void updateTimeToLive(); public: /** * @brief Constructor de la clase Item. * * Este constructor inicializa un objeto Item con el tipo especificado, posición inicial, área de juego, textura y animación. * * @param type El tipo de objeto (ItemType). * @param x La posición X inicial del objeto. * @param y La posición Y inicial del objeto. * @param play_area El área de juego donde el objeto se moverá. * @param texture La textura del objeto. * @param animation La animación asociada al objeto. */ Item(ItemType type, float x, float y, SDL_Rect &play_area, std::shared_ptr texture, const std::vector &animation); /** * @brief Destructor de la clase Item. * * Este destructor libera los recursos asociados con el objeto Item. */ ~Item() = default; /** * @brief Centra el objeto en la posición X. * * Esta función ajusta la posición X del objeto para que esté centrado en la posición X especificada. * Además, asegura que el objeto no se salga de los límites del área de juego. * * @param x La posición X en la que se desea centrar el objeto. */ void alignTo(int x); /** * @brief Pinta el objeto en la pantalla. * * Esta función renderiza el objeto en la pantalla si está habilitado. * Si el tiempo de vida (`time_to_live_`) es mayor que 200, renderiza el sprite. * Si el tiempo de vida es menor o igual a 200, renderiza el sprite de forma intermitente, basándose en un cálculo de módulo. */ void render(); /** * @brief Pone a cero todos los valores del objeto. * * Esta función desactiva el objeto estableciendo su estado `enabled_` a `false`. */ void disable(); /** * @brief Actualiza el objeto a su posición, animación y controla los contadores. * * Esta función mueve el objeto, actualiza su animación y controla el contador de tiempo de vida. * Llama a las funciones `move()`, `sprite_->update()` y `updateTimeToLive()`. */ void update(); // Getters float getPosX() const { return pos_x_; } float getPosY() const { return pos_y_; } int getWidth() const { return width_; } int getHeight() const { return height_; } ItemType getType() const { return type_; } bool isEnabled() const { return enabled_; } bool isOnFloor() const { return floor_collision_; } Circle &getCollider() { return collider_; } };