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,74 @@
#include "game/gameplay/door_tracker.hpp"
// [SINGLETON]
DoorTracker* DoorTracker::door_tracker = nullptr;
// [SINGLETON] Crearemos el objeto con esta función estática
void DoorTracker::init() {
DoorTracker::door_tracker = new DoorTracker();
}
// [SINGLETON] Destruiremos el objeto con esta función estática
void DoorTracker::destroy() {
delete DoorTracker::door_tracker;
}
// [SINGLETON] Con este método obtenemos el objeto y podemos trabajar con él
auto DoorTracker::get() -> DoorTracker* {
return DoorTracker::door_tracker;
}
// Comprueba si la puerta ya está abierta
auto DoorTracker::hasBeenOpened(const std::string& name, SDL_FPoint pos) -> bool {
if (const int INDEX = findByName(name); INDEX != NOT_FOUND) {
if (findByPos(INDEX, pos) != NOT_FOUND) {
return true;
}
}
return false;
}
// Marca la puerta como abierta
void DoorTracker::addDoor(const std::string& name, SDL_FPoint pos) {
if (!hasBeenOpened(name, pos)) {
if (const int INDEX = findByName(name); INDEX != NOT_FOUND) {
doors_.at(INDEX).pos.push_back(pos);
} else {
doors_.emplace_back(name, pos);
}
}
}
// Vacía el tracker
void DoorTracker::clear() {
doors_.clear();
}
// Busca una entrada en la lista por nombre
auto DoorTracker::findByName(const std::string& name) -> int {
int i = 0;
for (const auto& door : doors_) {
if (door.name == name) {
return i;
}
i++;
}
return NOT_FOUND;
}
// Busca una entrada en la lista por posición
auto DoorTracker::findByPos(int index, SDL_FPoint pos) -> int {
int i = 0;
for (const auto& door : doors_[index].pos) {
if ((door.x == pos.x) && (door.y == pos.y)) {
return i;
}
i++;
}
return NOT_FOUND;
}