#include "game/gameplay/item_tracker.hpp" // [SINGLETON] ItemTracker* ItemTracker::item_tracker = nullptr; // [SINGLETON] Crearemos el objeto con esta función estática void ItemTracker::init() { ItemTracker::item_tracker = new ItemTracker(); } // [SINGLETON] Destruiremos el objeto con esta función estática void ItemTracker::destroy() { delete ItemTracker::item_tracker; } // [SINGLETON] Con este método obtenemos el objeto y podemos trabajar con él auto ItemTracker::get() -> ItemTracker* { return ItemTracker::item_tracker; } // Comprueba si el objeto ya ha sido cogido auto ItemTracker::hasBeenPicked(const std::string& name, SDL_FPoint pos) -> bool { // Primero busca si ya hay una entrada con ese nombre if (const int INDEX = findByName(name); INDEX != NOT_FOUND) { // Luego busca si existe ya una entrada con esa posición if (findByPos(INDEX, pos) != NOT_FOUND) { return true; } } return false; } // Añade el objeto a la lista de objetos cogidos void ItemTracker::addItem(const std::string& name, SDL_FPoint pos) { // Comprueba si el objeto no ha sido recogido con anterioridad if (!hasBeenPicked(name, pos)) { // Primero busca si ya hay una entrada con ese nombre if (const int INDEX = findByName(name); INDEX != NOT_FOUND) { items_.at(INDEX).pos.push_back(pos); } // En caso contrario crea la entrada else { items_.emplace_back(name, pos); } } } // Busca una entrada en la lista por nombre auto ItemTracker::findByName(const std::string& name) -> int { int i = 0; for (const auto& item : items_) { if (item.name == name) { return i; } i++; } return NOT_FOUND; } // Busca una entrada en la lista por posición auto ItemTracker::findByPos(int index, SDL_FPoint pos) -> int { int i = 0; for (const auto& item : items_[index].pos) { if ((item.x == pos.x) && (item.y == pos.y)) { return i; } i++; } return NOT_FOUND; }