diff --git a/data/room/01.room b/data/room/01.room index b9b643c..9566b00 100644 --- a/data/room/01.room +++ b/data/room/01.room @@ -38,7 +38,14 @@ color=yellow [item] tileset=items.png -tile=1 -x=10 -y=10 +tile=0 +x=1 +y=7 +[item-end] + +[item] +tileset=items.png +tile=0 +x=17 +y=8 [item-end] \ No newline at end of file diff --git a/data/room/room1.tmx b/data/room/room1.tmx index 91215be..bc91374 100644 --- a/data/room/room1.tmx +++ b/data/room/room1.tmx @@ -3,22 +3,22 @@ -108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -108,0,0,0,0,108,108,108,108,108,108,108,108,108,108,108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -108,0,0,108,108,108,0,0,0,0,0,0,0,0,0,0,0,211,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,108,108,0,0,0,0,0,0,0,0,0,0,0,0,0, -108,108,108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,108,108,108,108,0,0,0,0,0,108,108,108,108,108, -108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,211,0,0,0,0,0,0,0, -108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -108,0,0,0,0,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,0,0,0,0,0,0,0, -108,0,0,0,0,0,0,0,0,211,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, -27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27 +21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +21,0,0,0,0,21,21,21,21,21,21,21,21,21,21,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +21,0,0,21,21,21,0,0,0,0,0,0,0,0,0,0,0,211,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,21,0,0,0,0,0,0,0,0,0,0,0,0,0, +21,21,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,21,21,21,0,0,0,0,0,21,21,21,21,21, +21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,211,0,0,0,0,0,0,0, +21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +21,0,0,0,0,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,0,0,0,0,0,0,0, +21,0,0,0,0,0,0,0,0,211,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21, +21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21 diff --git a/media/items/items.png b/media/items/items.png new file mode 100644 index 0000000..5899a71 Binary files /dev/null and b/media/items/items.png differ diff --git a/source/director.cpp b/source/director.cpp index a621b2d..3db0cc9 100644 --- a/source/director.cpp +++ b/source/director.cpp @@ -203,6 +203,7 @@ void Director::setFileList() mAsset->add("/media/tilesets/room1.png", bitmap); mAsset->add("/media/enemies/enemy01.png", bitmap); mAsset->add("/media/player/player01.png", bitmap); + mAsset->add("/media/items/items.png", bitmap); } // Carga el fichero de configuración diff --git a/source/game.cpp b/source/game.cpp index c82fa4c..42fee61 100644 --- a/source/game.cpp +++ b/source/game.cpp @@ -144,6 +144,7 @@ void Game::draw() mRoom->drawMap(); mRoom->drawEnemies(); + mRoom->drawItems(); mPlayer->draw(); // Texto en el centro de la pantalla diff --git a/source/item.cpp b/source/item.cpp index 028bf06..10e634c 100644 --- a/source/item.cpp +++ b/source/item.cpp @@ -3,22 +3,22 @@ #include // Constructor -Item::Item(SDL_Rect _rect, std::string _tileset, SDL_Renderer *_renderer, Asset *_asset) +Item::Item(item_t item) { // Obten punteros a objetos - asset = _asset; - renderer = _renderer; + asset = item.asset; + renderer = item.renderer; // Crea objetos texture = new LTexture(); - sprite = new Sprite(_rect, texture, renderer); + sprite = new Sprite(item.x, item.y, 8, 8, texture, renderer); // Carga la textura - loadTextureFromFile(texture, asset->get(_tileset), renderer); + loadTextureFromFile(texture, asset->get(item.tileset), renderer); // Inicia variables - sprite->setSpriteClip(0,0,8,8); - + sprite->setSpriteClip(item.tile * 8, 0, 8, 8); + // Inicializa los colores color_t c = stringToColor("blue"); color.push_back(c); @@ -53,11 +53,10 @@ Item::~Item() // Pinta el enemigo en pantalla void Item::draw() { - + sprite->render(); } // Actualiza las variables del objeto void Item::update() { - } diff --git a/source/item.h b/source/item.h index 9271538..d77911e 100644 --- a/source/item.h +++ b/source/item.h @@ -14,6 +14,16 @@ POSICION INICIAL PNG ASOCIADO */ +struct item_t +{ + SDL_Renderer *renderer; // El renderizador de la ventana + Asset *asset; // Objeto con la ruta a todos los ficheros de recursos + std::string tileset; // Fichero con los graficos del item + int x; // Posicion del item en pantalla + int y; // Posicion del item en pantalla + int tile; // Numero de tile dentro de la textura +}; + // Clase Item class Item { @@ -21,8 +31,8 @@ private: LTexture *texture; // Textura con los graficos del objeto Sprite *sprite; // Sprite del objeto - SDL_Renderer *renderer; // El renderizador de la ventana - Asset *asset; // Objeto con la ruta a todos los ficheros de recursos + SDL_Renderer *renderer; // El renderizador de la ventana + Asset *asset; // Objeto con la ruta a todos los ficheros de recursos std::vector color; // Vector con los colores del objeto // Comprueba si ha llegado al limite del recorrido para darse media vuelta @@ -30,7 +40,7 @@ private: public: // Constructor - Item(SDL_Rect _rect, std::string _tileset, SDL_Renderer *_renderer, Asset *_asset); + Item(item_t item); // Destructor ~Item(); diff --git a/source/room.cpp b/source/room.cpp index a9ef9a4..a207869 100644 --- a/source/room.cpp +++ b/source/room.cpp @@ -37,6 +37,12 @@ Room::~Room() delete enemy; } enemy_list.clear(); + + for (auto item : item_list) + { + delete item; + } + item_list.clear(); } // Carga las variables desde un fichero @@ -136,9 +142,9 @@ bool Room::load(std::string _file_path) // Si la linea contiene el texto [item] se realiza el proceso de carga de un item else if (line == "[item]") { - // enemy_t enemy; - // enemy.asset = asset; - // enemy.renderer = renderer; + item_t item; + item.asset = asset; + item.renderer = renderer; do { @@ -147,15 +153,15 @@ bool Room::load(std::string _file_path) // Encuentra la posición del caracter '=' int pos = line.find("="); // Procesa las dos subcadenas - // if (!setEnemy(&enemy, 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; - //} + if (!setItem(&item, 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 != "[item-end]"); - // Añade el enemigo al vector de enemigos - // enemy_list.push_back(new Enemy(enemy)); + // Añade el item al vector de items + item_list.push_back(new Item(item)); } // En caso contrario se parsea el fichero para buscar las variables y los valores @@ -298,6 +304,39 @@ bool Room::setEnemy(enemy_t *enemy, std::string _var, std::string _value) return success; } +// Asigna variables a una estructura item_t +bool Room::setItem(item_t *item, std::string _var, std::string _value) +{ + // Indicador de éxito en la asignación + bool success = true; + + if (_var == "tileset") + { + item->tileset = _value; + } + else if (_var == "x") + { + item->x = std::stof(_value) * BLOCK; + } + else if (_var == "y") + { + item->y = std::stof(_value) * BLOCK; + } + else if (_var == "tile") + { + item->tile = std::stof(_value); + } + else if (_var == "[item-end]") + { + } + else + { + success = false; + } + + return success; +} + // Devuelve el nombre de la habitación std::string Room::getName() { @@ -352,6 +391,15 @@ void Room::drawEnemies() } } +// Dibuja los objetos en pantalla +void Room::drawItems() +{ + for (auto item : item_list) + { + item->draw(); + } +} + // Actualiza las variables y objetos de la habitación void Room::update() { @@ -416,11 +464,11 @@ int Room::getTile(SDL_Point point) bool Room::enemyCollision(SDL_Rect &rect) { bool collision = false; - + for (auto enemy : enemy_list) { collision |= checkCollision(rect, enemy->getCollider()); } - + return collision; } \ No newline at end of file diff --git a/source/room.h b/source/room.h index aa614cd..d3114a3 100644 --- a/source/room.h +++ b/source/room.h @@ -4,6 +4,7 @@ #include "utils.h" #include "asset.h" #include "enemy.h" +#include "item.h" #include #include @@ -41,7 +42,7 @@ private: std::string tileset; // Imagen con los graficos para la habitación std::vector tilemap; // Indice de los tiles a dibujar en la habitación std::vector enemy_list; // Listado con los enemigos de la habitación - std::vector item_list; // Listado con los items que hay en la habitación + 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 SDL_Renderer *renderer; // El renderizador de la ventana @@ -56,6 +57,9 @@ private: // Asigna variables a una estructura enemy_t bool setEnemy(enemy_t *enemy, std::string _var, std::string _value); + // Asigna variables a una estructura item_t + bool setItem(item_t *item, std::string _var, std::string _value); + // Pinta el mapa de la habitación en la textura void fillMapTexture(); @@ -78,6 +82,9 @@ public: // Dibuja los enemigos en pantalla void drawEnemies(); + // Dibuja los objetos en pantalla + void drawItems(); + // Actualiza las variables y objetos de la habitación void update();