diff --git a/data/room/06.tmx b/data/room/06.tmx index a163514..64f9a00 100644 --- a/data/room/06.tmx +++ b/data/room/06.tmx @@ -15,8 +15,8 @@ 26,0,0,0,0,0,0,0,0,161,212,212,212,212,212,212,212,0,212,212,181,0,0,0,0,0,0,0,0,0,0,26, 26,0,0,0,0,0,0,0,161,0,0,0,0,0,0,0,0,0,0,0,0,181,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,161,0,0,0,0,0,0,0,0,0,269,0,0,0,0,181,0,0,0,0,0,0,0,0,26, -26,0,0,0,0,0,161,0,0,0,0,0,0,0,0,0,0,269,0,0,0,0,0,181,0,0,0,0,0,0,0,0, -0,0,0,0,0,161,0,0,0,0,0,0,0,0,0,0,0,289,0,0,0,0,0,0,181,0,0,0,0,0,0,0, +26,0,0,0,0,0,161,0,0,0,0,0,0,0,0,0,0,269,0,0,0,0,0,181,0,61,0,0,0,0,0,1, +0,0,0,0,0,161,0,0,0,0,0,0,0,0,0,0,0,289,0,0,0,0,0,0,181,0,0,0,0,0,0,1, 26,0,26,0,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26, 26,0,26,0,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26 diff --git a/source/player.cpp b/source/player.cpp index 3d8474e..b89bfa9 100644 --- a/source/player.cpp +++ b/source/player.cpp @@ -77,7 +77,12 @@ void Player::update() // Comprueba las entradas y modifica variables void Player::checkInput() { - // Solo comprueba las entradas de dirección cuando está de pie + // Solo comprueba las entradas de dirección cuando está dsobre una superficie + if (!isOnFloor()) + { + return; + } + if ((input->checkInput(INPUT_LEFT, REPEAT_TRUE)) && (state == s_standing)) { vx = -0.6f; @@ -189,8 +194,8 @@ void Player::applyGravity() { const float gf = 0.035f; - // La gravedad solo se aplica cuando está saltando - if (state == s_jumping) + // La gravedad solo se aplica cuando no está sobre una superficie + if (!isOnFloor()) { vy += gf; if (vy > maxVY) @@ -221,8 +226,112 @@ void Player::move() applyGravity(); // Aplica gravedad al jugador checkState(); // Comprueba el estado del jugador + //-------------------------------------------------------------- + //--- NUEVA DETECCION DE COLISIONES --- + //-------------------------------------------------------------- + + // Se mueve hacia la izquierda + if (vx < 0.0f) + { + // Crea el rectangulo de proyección en el eje X para ver si colisiona + SDL_Rect proj; + proj.x = lastPosition.x; + proj.y = lastPosition.y; + proj.h = h; + proj.w = (int)vx; + + // Comprueba la colisión + const int pos = room->checkRightSurfaces(&proj); + + // Calcula la nueva posición + if (pos == -1) + { // Si no hay colisión + x += vx; + } + else + { // Si hay colisión lo coloca donde colisiona + x = pos; + } + } + + // Se mueve hacia la derecha + if (vx > 0.0f) + { + // Crea el rectangulo de proyección en el eje X para ver si colisiona + SDL_Rect proj; + proj.x = lastPosition.x + w; + proj.y = lastPosition.y; + proj.h = h; + proj.w = (int)(vx); + + // Comprueba la colisión + const int pos = room->checkLeftSurfaces(&proj); + + // Calcula la nueva posición + if (pos == -1) + { // Si no hay colisión + x += vx; + } + else + { // Si hay colisión lo coloca donde colisiona + x = pos - w; + } + } + + // Se mueve hacia arriba + if (vy < 0.0f) + { + // Crea el rectangulo de proyección en el eje X para ver si colisiona + SDL_Rect proj; + proj.x = lastPosition.x; + proj.y = lastPosition.y; + proj.h = (int)vy; + proj.w = w; + + // Comprueba la colisión + const int pos = room->checkBottomSurfaces(&proj); + + // Calcula la nueva posición + if (pos == -1) + { // Si no hay colisión + y += vy; + } + else + { // Si hay colisión lo coloca donde colisiona + y = pos; + state = s_falling; + } + } + + // Se mueve hacia abajo + if (vy > 0.0f) + { + // Crea el rectangulo de proyección en el eje X para ver si colisiona + SDL_Rect proj; + proj.x = lastPosition.x; + proj.y = lastPosition.y + h; + proj.h = (int)vy; + proj.w = w; + + // Comprueba la colisión + const int pos = room->checkTopSurfaces(&proj); + + // Calcula la nueva posición + if (pos == -1) + { // Si no hay colisión + y += vy; + } + else + { // Si hay colisión lo coloca donde colisiona + y = pos - h; + state = s_standing; + } + } + + //-------------------------------------------------------------- + // Calcula la nueva posición del jugador y compensa en caso de colisión - x += vx; + /*x += vx; // Comprueba colisiones con muros if (checkWalls()) @@ -358,7 +467,7 @@ void Player::move() vy = 0.0f; } } - } + }*/ // Actualiza la posición del sprite sprite->setPosX(x); @@ -396,9 +505,11 @@ bool Player::isOnFloor() for (auto f : underFeet) { const tile_e tile = (room->getTile(f)); - onFloor |= (tile == t_wall || tile == t_passable || tile == t_slope_l || tile == t_slope_r); + onFloor |= (tile == t_wall || tile == t_passable); } + debug->add("ONFLOOR = " + std::to_string(onFloor)); + return onFloor; } diff --git a/source/room.cpp b/source/room.cpp index 27590c5..6d6ba64 100644 --- a/source/room.cpp +++ b/source/room.cpp @@ -476,7 +476,7 @@ void Room::fillMapTexture() SDL_SetRenderDrawColor(renderer, 0xFF, 0xFF, 0xFF, 0xFF); for (auto l : rightSurfaces) { - SDL_SetRenderDrawColor(renderer, (rand() % 128)+80, (rand() % 128)+80, (rand() % 128)+80, 0xFF); + SDL_SetRenderDrawColor(renderer, (rand() % 128) + 80, (rand() % 128) + 80, (rand() % 128) + 80, 0xFF); SDL_RenderDrawLine(renderer, l.x, l.y1, l.x, l.y2); } } @@ -862,4 +862,80 @@ void Room::setRightSurfaces() rightSurfaces.push_back(line); i++; } +} + +// Comprueba las colisiones +int Room::checkRightSurfaces(SDL_Rect *rect) +{ + bool collision = false; + int pos = -1; + + for (auto s : rightSurfaces) + { + collision = checkCollision(s, *rect); + if (collision) + { + pos = s.x; + break; + } + } + + return pos; +} + +// Comprueba las colisiones +int Room::checkLeftSurfaces(SDL_Rect *rect) +{ + bool collision = false; + int pos = -1; + + for (auto s : leftSurfaces) + { + collision = checkCollision(s, *rect); + if (collision) + { + pos = s.x; + break; + } + } + + return pos; +} + +// Comprueba las colisiones +int Room::checkTopSurfaces(SDL_Rect *rect) +{ + bool collision = false; + int pos = -1; + + for (auto s : topSurfaces) + { + collision = checkCollision(s, *rect); + if (collision) + { + pos = s.y; + break; + } + } + + return pos; +} + +// Comprueba las colisiones +int Room::checkBottomSurfaces(SDL_Rect *rect) +{ + bool collision = false; + int pos = -1; + + for (auto s : bottomSurfaces) + { + collision = checkCollision(s, *rect); + if (collision) + { + pos = s.y; + break; + } + } + + return pos; } \ No newline at end of file diff --git a/source/room.h b/source/room.h index 62dca68..e819a6b 100644 --- a/source/room.h +++ b/source/room.h @@ -149,6 +149,18 @@ public: // Obten la coordenada de la cuesta a partir de un punto perteneciente a ese tile int getSlopeHeight(SDL_Point p, tile_e slope); + + // Comprueba las colisiones + int checkRightSurfaces(SDL_Rect *rect); + + // Comprueba las colisiones + int checkLeftSurfaces(SDL_Rect *rect); + + // Comprueba las colisiones + int checkTopSurfaces(SDL_Rect *rect); + + // Comprueba las colisiones + int checkBottomSurfaces(SDL_Rect *rect); }; #endif