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 b64ec39..1aafe9e 100644 Binary files a/media/tilesets/room1.png and b/media/tilesets/room1.png differ 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: