Corregido un bug en las colisiones. El rectangulo era un pixel demasiado bajo o estrecho

This commit is contained in:
2022-09-10 21:04:42 +02:00
parent c905c348d5
commit cc68a02111
6 changed files with 45 additions and 23 deletions

View File

@@ -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,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,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,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,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,181,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,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,181,0,0,0,22,22,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,181,0,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,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,181,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,
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
</data> </data>

View File

@@ -227,11 +227,6 @@ void Game::renderDebugInfo()
SDL_RenderDrawLine(renderer, i, 0, i, PLAY_AREA_BOTTOM - 1); 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 // Pinta el texto
debug->setPos({1, 18 * 8}); debug->setPos({1, 18 * 8});
debug->render(); debug->render();

View File

@@ -50,7 +50,7 @@ Player::Player(player_t ini, std::string tileset, std::string animation, SDL_Ren
underFeet.insert(underFeet.end(), {p, p}); underFeet.insert(underFeet.end(), {p, p});
feet.insert(feet.end(), {p, p}); feet.insert(feet.end(), {p, p});
line = {0, 0, 0, 0}; r = {0, 0, 0, 0};
} }
// Destructor // Destructor
@@ -67,11 +67,20 @@ void Player::render()
sprite->render(); sprite->render();
if (debug->getEnabled()) 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[0].x, underFeet[0].y);
SDL_RenderDrawPoint(renderer, underFeet[1].x, underFeet[1].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; SDL_Rect proj;
proj.x = (int)(x + vx); proj.x = (int)(x + vx);
proj.y = (int)y; 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 proj.w = ceil(abs(vx)); // Para evitar que tenga un ancho de 0 pixels
r = proj;
// Comprueba la colisión con las superficies // Comprueba la colisión con las superficies
const int pos = room->checkRightSurfaces(&proj); const int pos = room->checkRightSurfaces(&proj);
@@ -268,7 +279,7 @@ void Player::move()
if (ly > -1) if (ly > -1)
{ {
y = ly - h; y = ly - h;
setState(s_standing); // setState(s_standing);
} }
} }
@@ -286,9 +297,11 @@ void Player::move()
SDL_Rect proj; SDL_Rect proj;
proj.x = (int)x + w; proj.x = (int)x + w;
proj.y = (int)y; proj.y = (int)y;
proj.h = h - 1; proj.h = h;
proj.w = ceil(vx); // Para evitar que tenga un ancho de 0 pixels proj.w = ceil(vx); // Para evitar que tenga un ancho de 0 pixels
r = proj;
// Comprueba la colisión // Comprueba la colisión
const int pos = room->checkLeftSurfaces(&proj); const int pos = room->checkLeftSurfaces(&proj);
@@ -310,7 +323,7 @@ void Player::move()
if (ry > -1) if (ry > -1)
{ {
y = ry - h; y = ry - h;
setState(s_standing); // setState(s_standing);
} }
} }
@@ -330,12 +343,14 @@ void Player::move()
// Se mueve hacia arriba // Se mueve hacia arriba
if (vy < 0.0f) 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; SDL_Rect proj;
proj.x = (int)x; proj.x = (int)x;
proj.y = (int)(y + vy); proj.y = (int)(y + vy);
proj.h = ceil(abs(vy)); // Para evitar que tenga una altura de 0 pixels 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 // Comprueba la colisión
const int pos = room->checkBottomSurfaces(&proj); const int pos = room->checkBottomSurfaces(&proj);
@@ -355,12 +370,14 @@ void Player::move()
// Se mueve hacia abajo // Se mueve hacia abajo
else if (vy > 0.0f) 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; SDL_Rect proj;
proj.x = (int)x; proj.x = (int)x;
proj.y = (int)y + h; proj.y = (int)y + h;
proj.h = ceil(vy); // Para evitar que tenga una altura de 0 pixels 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 // Comprueba la colisión con los muros
const int pos = room->checkTopSurfaces(&proj); const int pos = room->checkTopSurfaces(&proj);

View File

@@ -62,7 +62,7 @@ public:
SDL_Rect lastPosition; // Contiene la ultima posición del jugador, por si hay que deshacer algun movimiento 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 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 float maxVY; // Velocidad máxima que puede alcanzar al desplazarse en vertical
line_t line; SDL_Rect r;
// Comprueba las entradas y modifica variables // Comprueba las entradas y modifica variables
void checkInput(); void checkInput();

View File

@@ -178,19 +178,27 @@ bool checkCollision(v_line_t &l, SDL_Rect &r)
{ {
// Comprueba si la linea esta por la izquierda del rectangulo // Comprueba si la linea esta por la izquierda del rectangulo
if (l.x < r.x) if (l.x < r.x)
{
return false; return false;
}
// Comprueba si la linea esta por la derecha del rectangulo // Comprueba si la linea esta por la derecha del rectangulo
if (l.x >= r.x + r.w) if (l.x >= r.x + r.w)
{
return false; return false;
}
// Comprueba si el inicio de la linea esta debajo del rectangulo // Comprueba si el inicio de la linea esta debajo del rectangulo
if (l.y1 >= r.y + r.h) if (l.y1 >= r.y + r.h)
{
return false; return false;
}
// Comprueba si el final de la linea esta encima del rectangulo // Comprueba si el final de la linea esta encima del rectangulo
if (l.y2 < r.y) if (l.y2 < r.y)
{
return false; return false;
}
// Si ha llegado hasta aquí, hay colisión // Si ha llegado hasta aquí, hay colisión
return true; return true;

View File

@@ -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) Crear tiles que arrastren, tipo cinta transportadora
(A) Tiles animados (A) Tiles animados
(A) Crear ascensores (A) Crear ascensores
x (A) Crear rampas
x (A) Enemigos de diferente tamaño {cm:2022-08-30} 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 (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} 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} 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 indicador de si esta sonando la música
(A) Poner en el marcador el numero de habitaciones visitadas (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 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) 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 x (A) El titulo del juego hacerlo parecido al del Jet Set Willy in Paris