From 8f3fc5b52a4c16e2077856b5e3ef1f8b6806a61d Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Thu, 14 Jul 2022 11:03:35 +0200 Subject: [PATCH] Ya lleva la cuenta de los objetos recogidos --- source/game.cpp | 28 +++++++++++++++------------ source/game.h | 36 ++++++++++++++++++----------------- source/item_tracker.cpp | 42 ++++++++++++++++++++++++++++++----------- source/room.cpp | 23 +++++++++++++++------- source/room.h | 6 ++++-- 5 files changed, 86 insertions(+), 49 deletions(-) diff --git a/source/game.cpp b/source/game.cpp index 5962e74..5fd8eb3 100644 --- a/source/game.cpp +++ b/source/game.cpp @@ -16,7 +16,8 @@ Game::Game(SDL_Window *window, SDL_Renderer *renderer, Asset *asset, Lang *lang, // Crea los objetos mScreen = new Screen(window, renderer); - mRoom = new Room(mAsset->get(mCurrentRoom), mRenderer, mAsset); + mItemTracker = new Item_tracker(); + mRoom = new Room(mAsset->get(mCurrentRoom), mRenderer, mAsset, mItemTracker); mPlayer = new Player(mSpawnPoint, mAsset->get("player01.png"), mRenderer, mAsset, mInput, mRoom); mEventHandler = new SDL_Event(); mTextureText = new LTexture(); @@ -33,6 +34,18 @@ Game::~Game() mInput = nullptr; // Libera la memoria de los objetos + delete mScreen; + mScreen = nullptr; + + delete mItemTracker; + mItemTracker = nullptr; + + delete mRoom; + mRoom = nullptr; + + delete mPlayer; + mPlayer = nullptr; + delete mEventHandler; mEventHandler = nullptr; @@ -40,15 +53,6 @@ Game::~Game() delete mTextureText; mTextureText = nullptr; - delete mScreen; - mScreen = nullptr; - - delete mRoom; - mRoom = nullptr; - - delete mRoom; - mRoom = nullptr; - delete mText; mText = nullptr; @@ -131,7 +135,7 @@ void Game::update() delete mPlayer; // Crea la nueva habitación y el nuevo jugador - mRoom = new Room(mAsset->get(mCurrentRoom), mRenderer, mAsset); + mRoom = new Room(mAsset->get(mCurrentRoom), mRenderer, mAsset, mItemTracker); mPlayer = new Player(mSpawnPoint, mAsset->get("player01.png"), mRenderer, mAsset, mInput, mRoom); } @@ -220,7 +224,7 @@ bool Game::changeRoom(std::string file) mRoom = nullptr; // Crea un objeto habitación nuevo a partir del fichero - mRoom = new Room(mAsset->get(file), mRenderer, mAsset); + mRoom = new Room(mAsset->get(file), mRenderer, mAsset, mItemTracker); success = true; } diff --git a/source/game.h b/source/game.h index 7e87656..fb38c84 100644 --- a/source/game.h +++ b/source/game.h @@ -13,6 +13,7 @@ #include "screen.h" #include "asset.h" #include "room.h" +#include "item_tracker.h" #include "player.h" #include "jail_audio.h" @@ -23,23 +24,24 @@ class Game { private: - SDL_Renderer *mRenderer; // El renderizador de la ventana - SDL_Event *mEventHandler; // Manejador de eventos - Screen *mScreen; // Objeto encargado de manejar el renderizador - Room *mRoom; // Objeto encargado de gestionar cada habitación del juego - Player *mPlayer; // Objeto con el jugador - Asset *mAsset; // Objeto con la ruta a todos los ficheros de recursos - Lang *mLang; // Objeto para gestionar los textos en diferentes idiomas - Input *mInput; // Objeto pata gestionar la entrada - Text *mText; // Objeto para los textos del juego - Fade *mFade; // Objeto para renderizar fades - LTexture *mTextureText; // Textura para la fuente de texto - Uint32 mTicks; // Contador de ticks para ajustar la velocidad del programa - Uint8 mTicksSpeed; // Velocidad a la que se repiten los bucles del programa - section_t mSection; // Seccion actual dentro del juego - std::string mCurrentRoom; // Fichero de la habitación actual - player_t mSpawnPoint; // Lugar de la habitación donde aparece el jugador - bool mDebug; // Indica si el modo debug está activo + SDL_Renderer *mRenderer; // El renderizador de la ventana + SDL_Event *mEventHandler; // Manejador de eventos + Screen *mScreen; // Objeto encargado de manejar el renderizador + Room *mRoom; // Objeto encargado de gestionar cada habitación del juego + Player *mPlayer; // Objeto con el jugador + Item_tracker *mItemTracker; // Lleva el control de los objetos recogidos + Asset *mAsset; // Objeto con la ruta a todos los ficheros de recursos + Lang *mLang; // Objeto para gestionar los textos en diferentes idiomas + Input *mInput; // Objeto pata gestionar la entrada + Text *mText; // Objeto para los textos del juego + Fade *mFade; // Objeto para renderizar fades + LTexture *mTextureText; // Textura para la fuente de texto + Uint32 mTicks; // Contador de ticks para ajustar la velocidad del programa + Uint8 mTicksSpeed; // Velocidad a la que se repiten los bucles del programa + section_t mSection; // Seccion actual dentro del juego + std::string mCurrentRoom; // Fichero de la habitación actual + player_t mSpawnPoint; // Lugar de la habitación donde aparece el jugador + bool mDebug; // Indica si el modo debug está activo // Inicializa las variables void init(); diff --git a/source/item_tracker.cpp b/source/item_tracker.cpp index 46dc2cf..2196ea9 100644 --- a/source/item_tracker.cpp +++ b/source/item_tracker.cpp @@ -8,29 +8,49 @@ 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) { - // Primero busca si ya hay una entrada con ese nombre - const int index = findByName(name); - if (index != -1) + // 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); + // En caso contrario crea la entrada + else + { + item_tracker_t item; + item.name = name; + item.pos.push_back(pos); + list.push_back(item); + } } } diff --git a/source/room.cpp b/source/room.cpp index 8db6bab..fe8b519 100644 --- a/source/room.cpp +++ b/source/room.cpp @@ -4,11 +4,15 @@ #include // Constructor -Room::Room(std::string _file_path, SDL_Renderer *_renderer, Asset *_asset) +Room::Room(std::string _file_path, SDL_Renderer *_renderer, Asset *_asset, Item_tracker *_item_tracker) { - texture = new LTexture(); + // Copia los punteros a objetos asset = _asset; renderer = _renderer; + item_tracker = _item_tracker; + + // Crea los objetos + texture = new LTexture(); load(_file_path); loadTextureFromFile(texture, asset->get(tileset), renderer); @@ -161,7 +165,11 @@ bool Room::load(std::string _file_path) } while (line != "[item-end]"); // Añade el item al vector de items - item_list.push_back(new Item(item)); + const SDL_Point itemPos = {item.x, item.y}; + if (!item_tracker->hasBeenPicked(name, itemPos)) + { + item_list.push_back(new Item(item)); + } } // En caso contrario se parsea el fichero para buscar las variables y los valores @@ -479,17 +487,18 @@ bool Room::enemyCollision(SDL_Rect &rect) } // Indica si hay colision con un objeto a partir de un rectangulo -SDL_Point Room::itemCollision(SDL_Rect &rect) +bool Room::itemCollision(SDL_Rect &rect) { - SDL_Point p = {-1, -1}; + bool collision = false; for (auto item : item_list) { if (checkCollision(rect, item->getCollider())) { item->pick(); - p = item->getPos(); + item_tracker->addItem(name, item->getPos()); + collision = true; } } - return p; + return collision; } \ No newline at end of file diff --git a/source/room.h b/source/room.h index 5390540..9b972b1 100644 --- a/source/room.h +++ b/source/room.h @@ -5,6 +5,7 @@ #include "asset.h" #include "enemy.h" #include "item.h" +#include "item_tracker.h" #include #include @@ -45,6 +46,7 @@ private: std::vector item_list; // Listado con los items que hay en la habitación LTexture *texture; // Textura con los graficos de la habitación Asset *asset; // Objeto con la ruta a todos los ficheros de recursos + Item_tracker *item_tracker; // Lleva el control de los objetos recogidos SDL_Renderer *renderer; // El renderizador de la ventana SDL_Texture *map_texture; // Textura para dibujar el mapa de la habitación @@ -65,7 +67,7 @@ private: public: // Constructor - Room(std::string _file_path, SDL_Renderer *_renderer, Asset *_asset); + Room(std::string _file_path, SDL_Renderer *_renderer, Asset *_asset, Item_tracker *_item_tracker); // Destructor ~Room(); @@ -98,7 +100,7 @@ public: bool enemyCollision(SDL_Rect &rect); // Indica si hay colision con un objeto a partir de un rectangulo - SDL_Point itemCollision(SDL_Rect &rect); + bool itemCollision(SDL_Rect &rect); }; #endif