157 lines
6.0 KiB
C++
157 lines
6.0 KiB
C++
#pragma once
|
|
|
|
#include <SDL2/SDL_rect.h> // para SDL_Rect
|
|
#include <SDL2/SDL_stdinc.h> // para Uint16
|
|
#include <memory> // para shared_ptr, unique_ptr
|
|
#include <string> // para string
|
|
#include <vector> // 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é */
|
|
DEBIAN = 6, /**< Debian */
|
|
COFFEE_MACHINE = 7,/**< Máquina de café */
|
|
NONE = 8, /**< 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<AnimatedSprite> 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> texture, const std::vector<std::string> &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_; }
|
|
};
|