Ya lleva la cuenta de los objetos recogidos

This commit is contained in:
2022-07-14 11:03:35 +02:00
parent e752e90630
commit 8f3fc5b52a
5 changed files with 86 additions and 49 deletions

View File

@@ -16,7 +16,8 @@ Game::Game(SDL_Window *window, SDL_Renderer *renderer, Asset *asset, Lang *lang,
// Crea los objetos // Crea los objetos
mScreen = new Screen(window, renderer); 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); mPlayer = new Player(mSpawnPoint, mAsset->get("player01.png"), mRenderer, mAsset, mInput, mRoom);
mEventHandler = new SDL_Event(); mEventHandler = new SDL_Event();
mTextureText = new LTexture(); mTextureText = new LTexture();
@@ -33,6 +34,18 @@ Game::~Game()
mInput = nullptr; mInput = nullptr;
// Libera la memoria de los objetos // Libera la memoria de los objetos
delete mScreen;
mScreen = nullptr;
delete mItemTracker;
mItemTracker = nullptr;
delete mRoom;
mRoom = nullptr;
delete mPlayer;
mPlayer = nullptr;
delete mEventHandler; delete mEventHandler;
mEventHandler = nullptr; mEventHandler = nullptr;
@@ -40,15 +53,6 @@ Game::~Game()
delete mTextureText; delete mTextureText;
mTextureText = nullptr; mTextureText = nullptr;
delete mScreen;
mScreen = nullptr;
delete mRoom;
mRoom = nullptr;
delete mRoom;
mRoom = nullptr;
delete mText; delete mText;
mText = nullptr; mText = nullptr;
@@ -131,7 +135,7 @@ void Game::update()
delete mPlayer; delete mPlayer;
// Crea la nueva habitación y el nuevo jugador // 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); mPlayer = new Player(mSpawnPoint, mAsset->get("player01.png"), mRenderer, mAsset, mInput, mRoom);
} }
@@ -220,7 +224,7 @@ bool Game::changeRoom(std::string file)
mRoom = nullptr; mRoom = nullptr;
// Crea un objeto habitación nuevo a partir del fichero // 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; success = true;
} }

View File

@@ -13,6 +13,7 @@
#include "screen.h" #include "screen.h"
#include "asset.h" #include "asset.h"
#include "room.h" #include "room.h"
#include "item_tracker.h"
#include "player.h" #include "player.h"
#include "jail_audio.h" #include "jail_audio.h"
@@ -23,23 +24,24 @@
class Game class Game
{ {
private: private:
SDL_Renderer *mRenderer; // El renderizador de la ventana SDL_Renderer *mRenderer; // El renderizador de la ventana
SDL_Event *mEventHandler; // Manejador de eventos SDL_Event *mEventHandler; // Manejador de eventos
Screen *mScreen; // Objeto encargado de manejar el renderizador Screen *mScreen; // Objeto encargado de manejar el renderizador
Room *mRoom; // Objeto encargado de gestionar cada habitación del juego Room *mRoom; // Objeto encargado de gestionar cada habitación del juego
Player *mPlayer; // Objeto con el jugador Player *mPlayer; // Objeto con el jugador
Asset *mAsset; // Objeto con la ruta a todos los ficheros de recursos Item_tracker *mItemTracker; // Lleva el control de los objetos recogidos
Lang *mLang; // Objeto para gestionar los textos en diferentes idiomas Asset *mAsset; // Objeto con la ruta a todos los ficheros de recursos
Input *mInput; // Objeto pata gestionar la entrada Lang *mLang; // Objeto para gestionar los textos en diferentes idiomas
Text *mText; // Objeto para los textos del juego Input *mInput; // Objeto pata gestionar la entrada
Fade *mFade; // Objeto para renderizar fades Text *mText; // Objeto para los textos del juego
LTexture *mTextureText; // Textura para la fuente de texto Fade *mFade; // Objeto para renderizar fades
Uint32 mTicks; // Contador de ticks para ajustar la velocidad del programa LTexture *mTextureText; // Textura para la fuente de texto
Uint8 mTicksSpeed; // Velocidad a la que se repiten los bucles del programa Uint32 mTicks; // Contador de ticks para ajustar la velocidad del programa
section_t mSection; // Seccion actual dentro del juego Uint8 mTicksSpeed; // Velocidad a la que se repiten los bucles del programa
std::string mCurrentRoom; // Fichero de la habitación actual section_t mSection; // Seccion actual dentro del juego
player_t mSpawnPoint; // Lugar de la habitación donde aparece el jugador std::string mCurrentRoom; // Fichero de la habitación actual
bool mDebug; // Indica si el modo debug está activo player_t mSpawnPoint; // Lugar de la habitación donde aparece el jugador
bool mDebug; // Indica si el modo debug está activo
// Inicializa las variables // Inicializa las variables
void init(); void init();

View File

@@ -8,29 +8,49 @@ Item_tracker::Item_tracker()
// Destructor // Destructor
Item_tracker::~Item_tracker() Item_tracker::~Item_tracker()
{ {
list.clear();
} }
// Comprueba si el objeto ya ha sido cogido // Comprueba si el objeto ya ha sido cogido
bool Item_tracker::hasBeenPicked(std::string name, SDL_Point pos) 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 // Añade el objeto a la lista de objetos cogidos
void Item_tracker::addItem(std::string name, SDL_Point pos) void Item_tracker::addItem(std::string name, SDL_Point pos)
{ {
// Primero busca si ya hay una entrada con ese nombre // Comprueba si el objeto no ha sido recogido con anterioridad
const int index = findByName(name); if (!hasBeenPicked(name, pos))
if (index != -1)
{ {
} // 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 // En caso contrario crea la entrada
else else
{ {
item_tracker_t item; item_tracker_t item;
item.name = name; item.name = name;
item.pos.push_back(pos); item.pos.push_back(pos);
list.push_back(item); list.push_back(item);
}
} }
} }

View File

@@ -4,11 +4,15 @@
#include <sstream> #include <sstream>
// Constructor // 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; asset = _asset;
renderer = _renderer; renderer = _renderer;
item_tracker = _item_tracker;
// Crea los objetos
texture = new LTexture();
load(_file_path); load(_file_path);
loadTextureFromFile(texture, asset->get(tileset), renderer); loadTextureFromFile(texture, asset->get(tileset), renderer);
@@ -161,7 +165,11 @@ bool Room::load(std::string _file_path)
} while (line != "[item-end]"); } while (line != "[item-end]");
// Añade el item al vector de items // 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 // 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 // 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) for (auto item : item_list)
{ {
if (checkCollision(rect, item->getCollider())) if (checkCollision(rect, item->getCollider()))
{ {
item->pick(); item->pick();
p = item->getPos(); item_tracker->addItem(name, item->getPos());
collision = true;
} }
} }
return p; return collision;
} }

View File

@@ -5,6 +5,7 @@
#include "asset.h" #include "asset.h"
#include "enemy.h" #include "enemy.h"
#include "item.h" #include "item.h"
#include "item_tracker.h"
#include <string> #include <string>
#include <vector> #include <vector>
@@ -45,6 +46,7 @@ private:
std::vector<Item *> item_list; // Listado con los items que hay en la habitación std::vector<Item *> item_list; // Listado con los items que hay en la habitación
LTexture *texture; // Textura con los graficos de 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 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_Renderer *renderer; // El renderizador de la ventana
SDL_Texture *map_texture; // Textura para dibujar el mapa de la habitación SDL_Texture *map_texture; // Textura para dibujar el mapa de la habitación
@@ -65,7 +67,7 @@ private:
public: public:
// Constructor // 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 // Destructor
~Room(); ~Room();
@@ -98,7 +100,7 @@ public:
bool enemyCollision(SDL_Rect &rect); bool enemyCollision(SDL_Rect &rect);
// Indica si hay colision con un objeto a partir de un rectangulo // Indica si hay colision con un objeto a partir de un rectangulo
SDL_Point itemCollision(SDL_Rect &rect); bool itemCollision(SDL_Rect &rect);
}; };
#endif #endif