From cc68a021110c23ecc437a9b56199dd06da3d1b29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20Valor=20Mart=C3=ADnez?= Date: Sat, 10 Sep 2022 21:04:42 +0200 Subject: [PATCH] Corregido un bug en las colisiones. El rectangulo era un pixel demasiado bajo o estrecho --- data/room/06.tmx | 10 +++++----- source/game.cpp | 5 ----- source/player.cpp | 39 ++++++++++++++++++++++++++++----------- source/player.h | 2 +- source/utils.cpp | 8 ++++++++ todo.txt | 4 +++- 6 files changed, 45 insertions(+), 23 deletions(-) diff --git a/data/room/06.tmx b/data/room/06.tmx index d5bae88..7daec5d 100644 --- a/data/room/06.tmx +++ b/data/room/06.tmx @@ -12,11 +12,11 @@ 26,0,0,0,86,0,86,0,0,0,0,0,0,0,162,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26, 26,0,0,0,0,0,0,0,0,0,0,0,0,162,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26, 26,0,0,0,0,0,0,0,0,0,0,0,162,0,0,0,0,0,0,0,0,0,0,0,0,62,62,0,0,0,0,26, -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,62,62,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,26, -26,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,22,22,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, -26,0,0,0,0,161,0,0,0,0,0,0,0,0,0,0,81,289,81,0,0,0,0,0,181,0,0,0,0,0,0,0, +26,0,0,0,0,0,0,0,0,161,212,212,212,212,212,212,212,0,212,212,0,0,0,0,0,62,62,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,0,0,0,0,0,0,0,0,0,0,26, +26,0,0,0,0,0,0,161,0,0,0,0,0,0,0,0,0,269,0,0,0,0,0,0,0,0,22,22,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,0,0,0,0,0,0,0,0,0, +26,0,0,0,0,161,0,0,0,0,0,0,0,0,0,0,81,289,81,0,0,0,0,0,0,0,0,0,0,0,0,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,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,26,26,26,26,26,26 diff --git a/source/game.cpp b/source/game.cpp index 7d29492..062f08c 100644 --- a/source/game.cpp +++ b/source/game.cpp @@ -227,11 +227,6 @@ void Game::renderDebugInfo() SDL_RenderDrawLine(renderer, i, 0, i, PLAY_AREA_BOTTOM - 1); }*/ - // Pinta mascaras de sprite - SDL_SetRenderDrawColor(renderer, 0, 255, 0, 192); - rect = player->getRect(); - SDL_RenderFillRect(renderer, &rect); - // Pinta el texto debug->setPos({1, 18 * 8}); debug->render(); diff --git a/source/player.cpp b/source/player.cpp index 99085d3..c25c83e 100644 --- a/source/player.cpp +++ b/source/player.cpp @@ -50,7 +50,7 @@ Player::Player(player_t ini, std::string tileset, std::string animation, SDL_Ren underFeet.insert(underFeet.end(), {p, p}); feet.insert(feet.end(), {p, p}); - line = {0, 0, 0, 0}; + r = {0, 0, 0, 0}; } // Destructor @@ -67,11 +67,20 @@ void Player::render() sprite->render(); if (debug->getEnabled()) { - SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255); + // Pinta los underfeet + SDL_SetRenderDrawColor(renderer, 255, 0, 255, 255); SDL_RenderDrawPoint(renderer, underFeet[0].x, underFeet[0].y); SDL_RenderDrawPoint(renderer, underFeet[1].x, underFeet[1].y); - SDL_RenderDrawLine(renderer, line.x1, line.y1, line.x2, line.y2); + // Pinta rectangulo del jugador + SDL_SetRenderDrawColor(renderer, 0, 255, 0, 192); + SDL_Rect rect = getRect(); + SDL_RenderFillRect(renderer, &rect); + + // Pinta el rectangulo de movimiento + SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255); + SDL_RenderFillRect(renderer, &r); + debug->add("RECT: " + std::to_string(r.x) +","+ std::to_string(r.y) +","+ std::to_string(r.w) +","+ std::to_string(r.h)); } } @@ -244,9 +253,11 @@ void Player::move() SDL_Rect proj; proj.x = (int)(x + vx); proj.y = (int)y; - proj.h = h - 1; + proj.h = h; proj.w = ceil(abs(vx)); // Para evitar que tenga un ancho de 0 pixels + r = proj; + // Comprueba la colisión con las superficies const int pos = room->checkRightSurfaces(&proj); @@ -268,7 +279,7 @@ void Player::move() if (ly > -1) { y = ly - h; - setState(s_standing); + // setState(s_standing); } } @@ -286,9 +297,11 @@ void Player::move() SDL_Rect proj; proj.x = (int)x + w; proj.y = (int)y; - proj.h = h - 1; + proj.h = h; proj.w = ceil(vx); // Para evitar que tenga un ancho de 0 pixels + r = proj; + // Comprueba la colisión const int pos = room->checkLeftSurfaces(&proj); @@ -310,7 +323,7 @@ void Player::move() if (ry > -1) { y = ry - h; - setState(s_standing); + // setState(s_standing); } } @@ -330,12 +343,14 @@ void Player::move() // Se mueve hacia arriba if (vy < 0.0f) { - // Crea el rectangulo de proyección en el eje X para ver si colisiona + // Crea el rectangulo de proyección en el eje Y para ver si colisiona SDL_Rect proj; proj.x = (int)x; proj.y = (int)(y + vy); proj.h = ceil(abs(vy)); // Para evitar que tenga una altura de 0 pixels - proj.w = w - 1; + proj.w = w; + + r = proj; // Comprueba la colisión const int pos = room->checkBottomSurfaces(&proj); @@ -355,12 +370,14 @@ void Player::move() // Se mueve hacia abajo else if (vy > 0.0f) { - // Crea el rectangulo de proyección en el eje X para ver si colisiona + // Crea el rectangulo de proyección en el eje Y para ver si colisiona SDL_Rect proj; proj.x = (int)x; proj.y = (int)y + h; proj.h = ceil(vy); // Para evitar que tenga una altura de 0 pixels - proj.w = w - 1; + proj.w = w; + + r = proj; // Comprueba la colisión con los muros const int pos = room->checkTopSurfaces(&proj); diff --git a/source/player.h b/source/player.h index 4eeacb7..e794f58 100644 --- a/source/player.h +++ b/source/player.h @@ -62,7 +62,7 @@ public: SDL_Rect lastPosition; // Contiene la ultima posición del jugador, por si hay que deshacer algun movimiento int jump_ini; // Valor del eje Y en el que se inicia el salto float maxVY; // Velocidad máxima que puede alcanzar al desplazarse en vertical - line_t line; + SDL_Rect r; // Comprueba las entradas y modifica variables void checkInput(); diff --git a/source/utils.cpp b/source/utils.cpp index 76016cf..0d3da07 100644 --- a/source/utils.cpp +++ b/source/utils.cpp @@ -178,19 +178,27 @@ bool checkCollision(v_line_t &l, SDL_Rect &r) { // Comprueba si la linea esta por la izquierda del rectangulo if (l.x < r.x) + { return false; + } // Comprueba si la linea esta por la derecha del rectangulo if (l.x >= r.x + r.w) + { return false; + } // Comprueba si el inicio de la linea esta debajo del rectangulo if (l.y1 >= r.y + r.h) + { return false; + } // Comprueba si el final de la linea esta encima del rectangulo if (l.y2 < r.y) + { return false; + } // Si ha llegado hasta aquí, hay colisión return true; diff --git a/todo.txt b/todo.txt index 46d6754..f6dc85f 100644 --- a/todo.txt +++ b/todo.txt @@ -12,6 +12,7 @@ x (A) Modificar el salto para que coincida con el del JSW, no ha de colisionar l (A) Crear tiles que arrastren, tipo cinta transportadora (A) Tiles animados (A) Crear ascensores +x (A) Crear rampas x (A) Enemigos de diferente tamaño {cm:2022-08-30} (A) Color de los items al estilo jet set willy de amstrad, que brillan con dos colores x (A) Temporizador de inicio de los items, para poder hacer que brillen a distinto ritmo. Esto es incompatible con lo anterior {cm:2022-08-30} @@ -23,8 +24,9 @@ x (A) Tecla F para pasar a pantalla completa {cm:2022-08-30} x (A) Tecla + y - para cambiar tamaño de ventana. O control F1 a F4 {cm:2022-08-30} (A) Poner en el marcador el indicador de si esta sonando la música (A) Poner en el marcador el numero de habitaciones visitadas +(A) Los textos del marcador de colores x (A) Añadir a cada habitación el color del borde -(A) Añadir a cada habitación el color del nombre de la habitación +x (A) Añadir a cada habitación el color del nombre de la habitación x (A) Crear el logo al estilo del logo de ERBE o TOPO, con lineas que lo formen x (A) El titulo del juego hacerlo parecido al del Jet Set Willy in Paris