diff --git a/source/item_tracker.cpp b/source/item_tracker.cpp new file mode 100644 index 0000000..2196ea9 --- /dev/null +++ b/source/item_tracker.cpp @@ -0,0 +1,87 @@ +#include "item_tracker.h" + +// Constructor +Item_tracker::Item_tracker() +{ +} + +// Destructor +Item_tracker::~Item_tracker() +{ + list.clear(); +} + +// Comprueba si el objeto ya ha sido cogido +bool Item_tracker::hasBeenPicked(std::string name, SDL_Point pos) +{ + bool success = false; + + // Primero busca si ya hay una entrada con ese nombre + const int index = findByName(name); + if (index != -1) + { + // Luego busca si existe ya una entrada con esa posición + if (findByPos(index, pos) != -1) + { + success = true; + } + } + + return success; +} + +// Añade el objeto a la lista de objetos cogidos +void Item_tracker::addItem(std::string name, SDL_Point 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 + const int index = findByName(name); + if (index != -1) + { + list[index].pos.push_back(pos); + } + + // En caso contrario crea la entrada + else + { + item_tracker_t item; + item.name = name; + item.pos.push_back(pos); + list.push_back(item); + } + } +} + +// Busca una entrada en la lista por nombre +int Item_tracker::findByName(std::string name) +{ + const int c = -1; + + for (int i = 0; i < list.size(); i++) + { + if (list[i].name == name) + { + return i; + } + } + + return c; +} + +// Busca una entrada en la lista por posición +int Item_tracker::findByPos(int index, SDL_Point pos) +{ + const int c = -1; + + for (int i = 0; i < list[index].pos.size(); i++) + { + if ((list[index].pos[i].x == pos.x) && (list[index].pos[i].y == pos.y)) + { + return i; + } + } + + return c; +} \ No newline at end of file diff --git a/source/item_tracker.h b/source/item_tracker.h new file mode 100644 index 0000000..2072f09 --- /dev/null +++ b/source/item_tracker.h @@ -0,0 +1,42 @@ +#pragma once +#include "ifdefs.h" +#include "utils.h" +#include +#include + +#ifndef ITEM_TRACKER_H +#define ITEM_TRACKER_H + +struct item_tracker_t +{ + std::string name; // Nombre de la habitación donde se encuentra el objeto + std::vector pos; // Lista de objetos cogidos de la habitación +}; + +// Clase Item_tracker +class Item_tracker +{ +private: + std::vector list; // Lista con todos los objetos recogidos + + // Busca una entrada en la lista por nombre + int findByName(std::string name); + + // Busca una entrada en la lista por posición + int findByPos(int index, SDL_Point pos); + +public: + // Constructor + Item_tracker(); + + // Destructor + ~Item_tracker(); + + // Comprueba si el objeto ya ha sido cogido + bool hasBeenPicked(std::string name, SDL_Point pos); + + // Añade el objeto a la lista de objetos cogidos + void addItem(std::string name, SDL_Point pos); +}; + +#endif diff --git a/source/map.cpp b/source/map.cpp index faa7eb6..4d270da 100644 --- a/source/map.cpp +++ b/source/map.cpp @@ -170,26 +170,6 @@ bool Map::load(std::string file_path) } } while (line != "[/actors]"); - /*actor_t actor; - actor.asset = asset; - actor.renderer = renderer; - - do - { - std::getline(file, line); - - // Encuentra la posición del caracter '=' - int pos = line.find("="); - // Procesa las dos subcadenas - if (!setActor(&actor, line.substr(0, pos), line.substr(pos + 1, line.length()))) - { - printf("Warning: file %s\n, unknown parameter \"%s\"\n", filename.c_str(), line.substr(0, pos).c_str()); - success = false; - } - } while (line != "[/actor]"); - - // Añade el enemigo al vector de enemigos - actors.push_back(new ActorMovingPlatform(actor));*/ } // En caso contrario se parsea el fichero para buscar las variables y los valores