treballant en sistema de portes i claus

This commit is contained in:
2026-04-10 09:47:48 +02:00
parent 9aff4432df
commit 97c30bf9a1
37 changed files with 1236 additions and 110 deletions

View File

@@ -0,0 +1,69 @@
#include "key_manager.hpp"
#include <utility> // Para std::move
#include "core/audio/audio.hpp" // Para Audio
#include "game/defaults.hpp" // Para Defaults::Sound::Files
#include "game/entities/key.hpp" // Para Key
#include "game/gameplay/inventory.hpp" // Para Inventory
#include "game/gameplay/key_tracker.hpp" // Para KeyTracker
#include "utils/utils.hpp" // Para checkCollision
// Constructor
KeyManager::KeyManager(std::string room_id)
: room_id_(std::move(room_id)) {
}
// Añade una llave a la colección
void KeyManager::addKey(std::shared_ptr<Key> key) { // NOLINT(readability-identifier-naming)
keys_.push_back(std::move(key));
}
// Elimina todas las llaves
void KeyManager::clear() {
keys_.clear();
}
// Actualiza todas las llaves
void KeyManager::update(float delta_time) {
for (const auto& key : keys_) {
key->update(delta_time);
}
}
// Renderiza todas las llaves
void KeyManager::render() {
for (const auto& key : keys_) {
key->render();
}
}
// Pausa/despausa todas las llaves
void KeyManager::setPaused(bool paused) {
for (const auto& key : keys_) {
key->setPaused(paused);
}
}
// Comprueba si hay colisión con alguna llave
auto KeyManager::checkCollision(SDL_FRect& rect) -> bool {
for (int i = 0; i < static_cast<int>(keys_.size()); ++i) {
if (::checkCollision(rect, keys_.at(i)->getCollider())) {
// Añade el id de la llave al Inventory global
Inventory::get()->addKey(keys_.at(i)->getId());
// Registra la posición en KeyTracker (para no respawnear)
KeyTracker::get()->addKey(room_id_, keys_.at(i)->getPos());
// Elimina la llave de la colección
keys_.erase(keys_.begin() + i);
// Reproduce el sonido de pickup (reutiliza el sonido de item)
Audio::get()->playSound(Defaults::Sound::Files::ITEM, Audio::Group::GAME);
return true;
}
}
return false;
}