66 lines
2.2 KiB
C++
66 lines
2.2 KiB
C++
#pragma once
|
|
|
|
#include <SDL3/SDL.h>
|
|
|
|
#include <memory> // Para shared_ptr
|
|
#include <string> // Para string
|
|
#include <vector> // Para vector
|
|
|
|
#include "game/entities/key.hpp" // Para Key, Key::Data
|
|
|
|
/**
|
|
* @brief Gestor de llaves de una habitación
|
|
*
|
|
* Responsabilidades:
|
|
* - Almacenar y gestionar la colección de llaves
|
|
* - Actualizar y renderizar todas las llaves
|
|
* - Detectar colisiones con el jugador y gestionar pickup
|
|
* - Integración con Inventory (singleton global) y KeyTracker (persistencia por room)
|
|
*/
|
|
class KeyManager {
|
|
public:
|
|
explicit KeyManager(std::string room_id);
|
|
~KeyManager() = default;
|
|
|
|
// Prohibir copia y movimiento para evitar duplicación accidental
|
|
KeyManager(const KeyManager&) = delete;
|
|
auto operator=(const KeyManager&) -> KeyManager& = delete;
|
|
KeyManager(KeyManager&&) = delete;
|
|
auto operator=(KeyManager&&) -> KeyManager& = delete;
|
|
|
|
// Gestión de llaves
|
|
void addKey(std::shared_ptr<Key> key); // Añade una llave a la colección
|
|
void clear(); // Elimina todas las llaves
|
|
|
|
// Actualización y renderizado
|
|
void update(float delta_time); // Actualiza todas las llaves
|
|
void render(); // Renderiza todas las llaves
|
|
|
|
// Estado
|
|
void setPaused(bool paused); // Pausa/despausa todas las llaves
|
|
|
|
/**
|
|
* @brief Comprueba si hay colisión con alguna llave
|
|
*
|
|
* Si hay colisión:
|
|
* - Añade el id de la llave al Inventory global
|
|
* - Registra la posición en KeyTracker (para no respawnear)
|
|
* - Elimina la llave de la colección
|
|
* - Reproduce el sonido de pickup
|
|
*
|
|
* @param rect Rectángulo de colisión
|
|
* @return true si hubo colisión, false en caso contrario
|
|
*/
|
|
auto checkCollision(SDL_FRect& rect) -> bool;
|
|
|
|
#ifdef _DEBUG
|
|
// --- API para el editor (debug) ---
|
|
[[nodiscard]] auto getCount() const -> int { return static_cast<int>(keys_.size()); }
|
|
auto getKey(int index) -> std::shared_ptr<Key>& { return keys_.at(index); }
|
|
#endif
|
|
|
|
private:
|
|
std::vector<std::shared_ptr<Key>> keys_; // Colección de llaves
|
|
std::string room_id_; // Identificador de la habitación
|
|
};
|