From 8d49c785198698f179bca11d56d65f50bae2fcfd Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Sun, 10 Jul 2022 21:10:45 +0200 Subject: [PATCH] Ya funcionan los tiles atravesables --- source/game.cpp | 45 +++++++++++++++++++++++++++++---------------- source/player.cpp | 6 ++++++ source/player.h | 3 +++ source/room.cpp | 22 ++++++++++++++-------- source/room.h | 8 ++++++-- 5 files changed, 58 insertions(+), 26 deletions(-) diff --git a/source/game.cpp b/source/game.cpp index 8fbbd78..7ca19aa 100644 --- a/source/game.cpp +++ b/source/game.cpp @@ -145,6 +145,9 @@ void Game::draw() text = "status: " + std::to_string(mPlayer->status); mText->write(0, 17 * 8, text); + text = "foot: " + std::to_string((int)mPlayer->getLeftFoot().y); + mText->write(0, 18 * 8, text); + // Actualiza la pantalla mScreen->blit(); } @@ -208,14 +211,24 @@ void Game::checkPlayerOnBorder() // Comprueba si el jugador esta sobre el suelo void Game::checkPlayerOnFloor() { - // Comprueba ambos pies - if ((mRoom->isFloor(mPlayer->getLeftFoot())) || (mRoom->isFloor(mPlayer->getRightFoot()))) - { - mPlayer->setStatus(STATUS_STANDING); - } - else if (mPlayer->getStatus() != STATUS_JUMPING) - { - mPlayer->setStatus(STATUS_FALLING); + // Comprueba si tiene suelo bajo los pies solo cuando no hay velocidad de subida + // y solo cuando el pie este encima de un bloque, es decir, en multiplos de 8 + if ((mPlayer->getVelY() >= 0) && ((int)mPlayer->getLeftFoot().y % 8 == 0)) + { // Comprueba ambos pies + bool test = false; + test |= (mRoom->getTile(mPlayer->getLeftFoot()) == TILE_SOLID); + test |= (mRoom->getTile(mPlayer->getRightFoot()) == TILE_SOLID); + test |= (mRoom->getTile(mPlayer->getLeftFoot()) == TILE_TRAVESSABLE); + test |= (mRoom->getTile(mPlayer->getRightFoot()) == TILE_TRAVESSABLE); + + if (test) + { + mPlayer->setStatus(STATUS_STANDING); + } + else if (mPlayer->getStatus() != STATUS_JUMPING) + { + mPlayer->setStatus(STATUS_FALLING); + } } } @@ -234,14 +247,14 @@ void Game::checkPlayerAndWalls() SDL_Point p7 = {rect.x + 7, rect.y + 15}; SDL_Point p8 = {rect.x, rect.y + 15}; - bool test = mRoom->isFloor(p1); - test |= mRoom->isFloor(p2); - test |= mRoom->isFloor(p3); - test |= mRoom->isFloor(p4); - test |= mRoom->isFloor(p5); - test |= mRoom->isFloor(p6); - test |= mRoom->isFloor(p7); - test |= mRoom->isFloor(p8); + bool 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); if (test) { diff --git a/source/player.cpp b/source/player.cpp index 45ab47b..3211b8a 100644 --- a/source/player.cpp +++ b/source/player.cpp @@ -219,6 +219,12 @@ int Player::getStatus() return status; } +// Obtiene la velocidad en el eje Y del jugador +float Player::getVelY() +{ + return sprite->getVelY(); +} + // Aplica gravedad al jugador void Player::applyGravity() { diff --git a/source/player.h b/source/player.h index 1fcf2bc..a8725f5 100644 --- a/source/player.h +++ b/source/player.h @@ -93,6 +93,9 @@ public: // Obtiene el estado del jugador int getStatus(); + // Obtiene la velocidad en el eje Y del jugador + float getVelY(); + // Obtiene el rectangulo que delimita al jugador SDL_Rect getRect(); diff --git a/source/room.cpp b/source/room.cpp index f01075a..576ebce 100644 --- a/source/room.cpp +++ b/source/room.cpp @@ -308,18 +308,24 @@ std::string Room::getRoom(int border) return ""; } -// Indica si el tile al que pertenece el pixel es sólido o no -bool Room::isFloor(SDL_Point point) +// Devuelve el tipo de tile que hay en ese pixel +int Room::getTile(SDL_Point point) { - int tile = ((point.y / 8) * 32) + (point.x / 8); - - if (tile < 512) + int pos = ((point.y / 8) * 32) + (point.x / 8); + int tile = TILE_EMPTY; + + if (pos < 512) { - if (tilemap[tile] != 0) + if (tilemap[pos] == 41) { - return true; + return TILE_SOLID; + } + + if (tilemap[pos] == 81) + { + return TILE_TRAVESSABLE; } } - return false; + return tile; } diff --git a/source/room.h b/source/room.h index d245634..5bc4923 100644 --- a/source/room.h +++ b/source/room.h @@ -10,6 +10,10 @@ #ifndef ROOM_H #define ROOM_H +#define TILE_EMPTY 0 +#define TILE_SOLID 1 +#define TILE_TRAVESSABLE 2 + /* Cada habitación se crea y destruye cada vez que se entra o sale de la misma Cada habitacion si que tendra lo siguiente: @@ -81,8 +85,8 @@ public: // Devuelve la cadena del fichero de la habitación contigua segun el borde std::string getRoom(int border); - // Indica si el tile al que pertenece el pixel es sólido o no - bool isFloor(SDL_Point point); + // Devuelve el tipo de tile que hay en ese pixel + int getTile(SDL_Point point); }; #endif