Files

53 lines
2.1 KiB
C++

#pragma once
#include <SDL3/SDL.h>
#include <memory> // Para shared_ptr
#include <string> // Para string
class AnimatedSprite;
/**
* @brief Llave coleccionable
*
* Entidad de 16x16 px con una animación "default". Al ser recogida por el
* jugador, su identificador (id_) se añade al Inventory global y la llave
* desaparece de la habitación. Una llave puede abrir todas las puertas con
* el mismo id; no se consume al usarse.
*/
class Key {
public:
struct Data {
std::string animation_path; // Ruta al fichero de animación (ej. "key1.yaml")
std::string id; // Identificador que abre las puertas con el mismo id
float x{0.0F}; // Posición X en píxeles
float y{0.0F}; // Posición Y en píxeles
};
static constexpr float FLOAT_PERIOD_S = 2.0F; // Segundos por ciclo sinusoidal (todas las llaves sincronizadas)
static constexpr float FLOAT_AMPLITUDE = 2.0F; // Amplitud en píxeles
explicit Key(const Data& data);
~Key() = default;
void render(); // Pinta la llave en pantalla
void update(float delta_time); // Avanza la animación
auto getCollider() -> SDL_FRect& { return collider_; } // Rectángulo de colisión
[[nodiscard]] auto getPos() const -> SDL_FPoint; // Posición actual (para tracker)
[[nodiscard]] auto getId() const -> const std::string& { return id_; } // Identificador de la llave
void setPaused(bool paused) { is_paused_ = paused; } // Pausa/despausa la animación
#ifdef _DEBUG
void setPosition(float x, float y); // Mueve sprite y collider en vivo (editor)
#endif
private:
std::shared_ptr<AnimatedSprite> sprite_; // Sprite animado de la llave
SDL_FRect collider_{}; // Rectángulo de colisión
std::string id_; // Identificador
float base_y_{0.0F}; // Posición Y base (el sprite oscila alrededor)
bool is_paused_{false}; // Indica si la llave está pausada
};