From d95645e930f0f13ebf597941b29cc641857912e3 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Thu, 14 Jul 2022 16:37:58 +0200 Subject: [PATCH] Creados tiles que matan --- data/room/room1.tmx | 4 +-- media/tilesets/room1.png | Bin 2991 -> 3087 bytes source/game.cpp | 70 ++++++++++++++++++++++++++------------- source/game.h | 3 ++ source/room.cpp | 8 ++++- source/room.h | 1 + todo.txt | 6 +++- 7 files changed, 65 insertions(+), 27 deletions(-) diff --git a/data/room/room1.tmx b/data/room/room1.tmx index bc91374..aebe041 100644 --- a/data/room/room1.tmx +++ b/data/room/room1.tmx @@ -16,8 +16,8 @@ 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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,381,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,381,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/tilesets/room1.png b/media/tilesets/room1.png index b64ec399ae38e678889af0cfb34a58708b6fdda7..1aafe9e200d4e5ba11d09c5f76ff8ff1e4e696e6 100644 GIT binary patch literal 3087 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 K(vYI>7WHpEHPFHU literal 2991 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 RIe*}Q<#`*^inH#~{{mI&(Z~P* diff --git a/source/game.cpp b/source/game.cpp index 5fd8eb3..9740275 100644 --- a/source/game.cpp +++ b/source/game.cpp @@ -128,17 +128,7 @@ void Game::update() checkPlayerOnBorder(); checkPlayerOnFloor(); checkPlayerAndItems(); - if (checkPlayerAndEnemies()) - { - // Destruye la habitacion y el jugador - delete mRoom; - delete mPlayer; - - // Crea la nueva habitación y el nuevo jugador - mRoom = new Room(mAsset->get(mCurrentRoom), mRenderer, mAsset, mItemTracker); - mPlayer = new Player(mSpawnPoint, mAsset->get("player01.png"), mRenderer, mAsset, mInput, mRoom); - } - + checkPlayerAndEnemies(); checkInput(); } } @@ -300,7 +290,7 @@ void Game::checkPlayerOnFloor() // Comprueba que el jugador no atraviese ninguna pared void Game::checkPlayerAndWalls() { - // Comprueba las cuatro esquinas de los dos tiles del jugador + // Obtiene los ocho puntos de colisión del jugador const SDL_Rect rect = mPlayer->getRect(); const SDL_Point p1 = {rect.x, rect.y}; const SDL_Point p2 = {rect.x + 7, rect.y}; @@ -311,32 +301,66 @@ void Game::checkPlayerAndWalls() const SDL_Point p7 = {rect.x + 7, rect.y + 15}; const SDL_Point p8 = {rect.x, rect.y + 15}; - bool test = false; - test |= (mRoom->getTile(p1) == TILE_SOLID); - test |= (mRoom->getTile(p2) == TILE_SOLID); - test |= (mRoom->getTile(p3) == TILE_SOLID); - test |= (mRoom->getTile(p4) == TILE_SOLID); - test |= (mRoom->getTile(p5) == TILE_SOLID); - test |= (mRoom->getTile(p6) == TILE_SOLID); - test |= (mRoom->getTile(p7) == TILE_SOLID); - test |= (mRoom->getTile(p8) == TILE_SOLID); + // Comprueba si ha colisionado con un muro + bool wall = false; + wall |= (mRoom->getTile(p1) == TILE_SOLID); + wall |= (mRoom->getTile(p2) == TILE_SOLID); + wall |= (mRoom->getTile(p3) == TILE_SOLID); + wall |= (mRoom->getTile(p4) == TILE_SOLID); + wall |= (mRoom->getTile(p5) == TILE_SOLID); + wall |= (mRoom->getTile(p6) == TILE_SOLID); + wall |= (mRoom->getTile(p7) == TILE_SOLID); + wall |= (mRoom->getTile(p8) == TILE_SOLID); - if (test) + if (wall) { // Si hay colisión, deshace el movimiento y lo pone en modo caída mPlayer->undoLastMove(); mPlayer->setStatus(STATUS_FALLING); } + + // Comprueba si ha colisionado con un tile de los que matan al jugador + bool death = false; + death |= (mRoom->getTile(p1) == TILE_KILL); + death |= (mRoom->getTile(p2) == TILE_KILL); + death |= (mRoom->getTile(p3) == TILE_KILL); + death |= (mRoom->getTile(p4) == TILE_KILL); + death |= (mRoom->getTile(p5) == TILE_KILL); + death |= (mRoom->getTile(p6) == TILE_KILL); + death |= (mRoom->getTile(p7) == TILE_KILL); + death |= (mRoom->getTile(p8) == TILE_KILL); + + if (death) + { + killPlayer(); + } } // Comprueba las colisiones del jugador con los enemigos bool Game::checkPlayerAndEnemies() { - return mRoom->enemyCollision(mPlayer->getCollider()); + const bool death = mRoom->enemyCollision(mPlayer->getCollider()); + if (death) + { + killPlayer(); + } + return death; } // Comprueba las colisiones del jugador con los objetos void Game::checkPlayerAndItems() { mRoom->itemCollision(mPlayer->getCollider()); +} + +// Mata al jugador +void Game::killPlayer() +{ + // Destruye la habitacion y el jugador + delete mRoom; + delete mPlayer; + + // Crea la nueva habitación y el nuevo jugador + mRoom = new Room(mAsset->get(mCurrentRoom), mRenderer, mAsset, mItemTracker); + mPlayer = new Player(mSpawnPoint, mAsset->get("player01.png"), mRenderer, mAsset, mInput, mRoom); } \ No newline at end of file diff --git a/source/game.h b/source/game.h index fb38c84..d5023d2 100644 --- a/source/game.h +++ b/source/game.h @@ -76,6 +76,9 @@ private: // Comprueba las colisiones del jugador con los objetos void checkPlayerAndItems(); + // Mata al jugador + void killPlayer(); + public: // Constructor Game(SDL_Window *window, SDL_Renderer *renderer, Asset *asset, Lang *lang, Input *input); diff --git a/source/room.cpp b/source/room.cpp index fe8b519..119e348 100644 --- a/source/room.cpp +++ b/source/room.cpp @@ -464,10 +464,16 @@ int Room::getTile(SDL_Point point) } // Los tiles mayores de 80 son atravesables - if (tilemap[pos] > 200) + if ((tilemap[pos] > 200) && (tilemap[pos] < 381)) { return TILE_TRAVESSABLE; } + + // Los tiles mayores de 80 son atravesables + if ((tilemap[pos] > 380) && (tilemap[pos] < 400)) + { + return TILE_KILL; + } } return tile; diff --git a/source/room.h b/source/room.h index 9b972b1..509690f 100644 --- a/source/room.h +++ b/source/room.h @@ -15,6 +15,7 @@ #define TILE_EMPTY 0 #define TILE_SOLID 1 #define TILE_TRAVESSABLE 2 +#define TILE_KILL 3 /* Cada habitación se crea y destruye cada vez que se entra o sale de la misma diff --git a/todo.txt b/todo.txt index 2089dc1..a7c6b46 100644 --- a/todo.txt +++ b/todo.txt @@ -1,13 +1,17 @@ [x] Hacer que deje de poder moverse tras el salto al alcanzar la misma posicion en altura que tenia cuando saltó [x] Arreglar que no atraviese tiles atravaseables al caer muy rapido [x] Leer los mapas directamente del archivo tmx -[ ] Crear la clase item +[x] Crear la clase item [x] Colisiones con los enemigos [x] Decidir un diseño para qué sucede en caso de morir: Recordar el punto por donde se entró al mapa y la velocidad en el eje X/Y que llevaba el personaje, crear puntos de reaparicion en las habitaciones, etc En el Jet Set Willy el juego recuerda la posicion y el momento. En las Tres Luces de Glaurung solo la posición. Se va a optar por seguir el diseño del Jet Set Willy [ ] Crear tiles que maten [ ] Crear tiles que deslicen, (no tipo hielo sino cinta) +[ ] Tiles animados [ ] Crear ascensores +[ ] Enemigos de diferente tamaño +[ ] Color de los items +[ ] Temporizador de inicio de los items TEMAS: