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
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;
}

View File

@@ -13,6 +13,7 @@
#include "screen.h"
#include "asset.h"
#include "room.h"
#include "item_tracker.h"
#include "player.h"
#include "jail_audio.h"
@@ -28,6 +29,7 @@ private:
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

View File

@@ -8,20 +8,39 @@ 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
@@ -32,6 +51,7 @@ void Item_tracker::addItem(std::string name, SDL_Point pos)
item.pos.push_back(pos);
list.push_back(item);
}
}
}
// Busca una entrada en la lista por nombre

View File

@@ -4,11 +4,15 @@
#include <sstream>
// 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,8 +165,12 @@ bool Room::load(std::string _file_path)
} while (line != "[item-end]");
// Añade el item al vector de items
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
else
@@ -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;
}

View File

@@ -5,6 +5,7 @@
#include "asset.h"
#include "enemy.h"
#include "item.h"
#include "item_tracker.h"
#include <string>
#include <vector>
@@ -45,6 +46,7 @@ private:
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
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