Files
projecte_2026/source/game/gameplay/key_manager.hpp

60 lines
1.9 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;
private:
std::vector<std::shared_ptr<Key>> keys_; // Colección de llaves
std::string room_id_; // Identificador de la habitación
};