From e1c302e0fca7ecb4b4308093682cf1c418a8a0fc Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Sun, 18 Sep 2022 13:09:08 +0200 Subject: [PATCH] Ya cambia de habitacion arriba-abajo a traves de rampas. Las rampas ya se detectan al caer (no al saltar) --- data/room/03.tmx | 2 +- source/player.cpp | 49 +++++++++++++++++++++++++++++++++-------------- 2 files changed, 36 insertions(+), 15 deletions(-) diff --git a/data/room/03.tmx b/data/room/03.tmx index 39674ae..9c0c32d 100644 --- a/data/room/03.tmx +++ b/data/room/03.tmx @@ -17,7 +17,7 @@ 21,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,162,0,0,0,0,0,0,0,21,0,0,0,0,0,21,21, 21,21,0,0,0,0,0,0,0,213,213,213,213,213,213,213,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,0,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,161,0,0,0,0,0,0,0,0,0,253,253,253,253,0,0,0,0,0,0,0,0,21,21, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,253,253,253,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 diff --git a/source/player.cpp b/source/player.cpp index 3a3af50..9195b42 100644 --- a/source/player.cpp +++ b/source/player.cpp @@ -259,20 +259,22 @@ void Player::switchBorders() { if (border == BORDER_TOP) { - y = PLAY_AREA_BOTTOM - h - 1; - jumpIni += 128; + y = PLAY_AREA_BOTTOM - h - 0 - BLOCK; + setState(s_standing); + // jumpIni += 128; } else if (border == BORDER_BOTTOM) { - y = PLAY_AREA_TOP + 1; + y = PLAY_AREA_TOP + 0; + setState(s_standing); } else if (border == BORDER_RIGHT) { - x = PLAY_AREA_LEFT + 1; + x = PLAY_AREA_LEFT + 0; } if (border == BORDER_LEFT) { - x = PLAY_AREA_RIGHT - w - 1; + x = PLAY_AREA_RIGHT - w - 0; } onBorder = false; @@ -343,7 +345,7 @@ void Player::move() // Si ha tocado alguna rampa mientras camina (sin saltar), asciende if (state != s_jumping) { - v_line_t leftSide = {(int)x, (int)y + h - 2, (int)y + h - 1}; + v_line_t leftSide = {(int)x, (int)y + h - 2, (int)y + h - 1}; // Comprueba solo los dos pixels de abajo const int ly = room->checkLeftSlopes(&leftSide); if (ly > -1) { @@ -386,7 +388,7 @@ void Player::move() // Si ha tocado alguna rampa mientras camina (sin saltar), asciende if (state != s_jumping) { - v_line_t rightSide = {(int)x + w - 1, (int)y + h - 2, (int)y + h - 1}; + v_line_t rightSide = {(int)x + w - 1, (int)y + h - 2, (int)y + h - 1}; // Comprueba solo los dos pixels de abajo const int ry = room->checkRightSlopes(&rightSide); if (ry > -1) { @@ -448,17 +450,36 @@ void Player::move() // Comprueba la colisión con los muros const int pos = room->checkTopSurfaces(&proj); - - // Calcula la nueva posición - if (pos == -1) - { // Si no hay colisión - y += vy; - } - else + if (pos > -1) { // Si hay colisión lo mueve hasta donde no colisiona y pasa a estar sobre el suelo y = pos - h; setState(s_standing); } + else + { // Si no hay colisión con los muros, comprueba la colisión con las rampas + if (state != s_jumping) + { // Las rampas no se miran si se está saltando + v_line_t leftSide = {proj.x, proj.y, proj.y + proj.h - 1}; + v_line_t rightSide = {proj.x + proj.w - 1, proj.y, proj.y + proj.h - 1}; + const int p = std::max(room->checkRightSlopes(&rightSide), room->checkLeftSlopes(&leftSide)); + if (p > -1) + { // No está saltando y hay colisión con una rampa + // Calcula la nueva posición + y = p - h; + setState(s_standing); + } + else + { // No está saltando y no hay colisón con una rampa + // Calcula la nueva posición + y += vy; + } + } + else + { // Esta saltando y no hay colisión con los muros + // Calcula la nueva posición + y += vy; + } + } } // Actualiza la posición del sprite