#pragma once #include #include // Para shared_ptr #include // Para string #include // 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); // 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(keys_.size()); } auto getKey(int index) -> std::shared_ptr& { return keys_.at(index); } #endif private: std::vector> keys_; // Colección de llaves std::string room_id_; // Identificador de la habitación };