Trabajando en las colisiones y estados

This commit is contained in:
2022-09-08 14:09:05 +02:00
parent 9fc4c2d8b0
commit 88d6471dc8
4 changed files with 208 additions and 9 deletions

View File

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

View File

@@ -77,7 +77,12 @@ void Player::update()
// Comprueba las entradas y modifica variables // Comprueba las entradas y modifica variables
void Player::checkInput() 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)) if ((input->checkInput(INPUT_LEFT, REPEAT_TRUE)) && (state == s_standing))
{ {
vx = -0.6f; vx = -0.6f;
@@ -189,8 +194,8 @@ void Player::applyGravity()
{ {
const float gf = 0.035f; const float gf = 0.035f;
// La gravedad solo se aplica cuando está saltando // La gravedad solo se aplica cuando no está sobre una superficie
if (state == s_jumping) if (!isOnFloor())
{ {
vy += gf; vy += gf;
if (vy > maxVY) if (vy > maxVY)
@@ -221,8 +226,112 @@ void Player::move()
applyGravity(); // Aplica gravedad al jugador applyGravity(); // Aplica gravedad al jugador
checkState(); // Comprueba el estado del 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 // Calcula la nueva posición del jugador y compensa en caso de colisión
x += vx; /*x += vx;
// Comprueba colisiones con muros // Comprueba colisiones con muros
if (checkWalls()) if (checkWalls())
@@ -358,7 +467,7 @@ void Player::move()
vy = 0.0f; vy = 0.0f;
} }
} }
} }*/
// Actualiza la posición del sprite // Actualiza la posición del sprite
sprite->setPosX(x); sprite->setPosX(x);
@@ -396,9 +505,11 @@ bool Player::isOnFloor()
for (auto f : underFeet) for (auto f : underFeet)
{ {
const tile_e tile = (room->getTile(f)); 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; return onFloor;
} }

View File

@@ -476,7 +476,7 @@ void Room::fillMapTexture()
SDL_SetRenderDrawColor(renderer, 0xFF, 0xFF, 0xFF, 0xFF); SDL_SetRenderDrawColor(renderer, 0xFF, 0xFF, 0xFF, 0xFF);
for (auto l : rightSurfaces) 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); SDL_RenderDrawLine(renderer, l.x, l.y1, l.x, l.y2);
} }
} }
@@ -862,4 +862,80 @@ void Room::setRightSurfaces()
rightSurfaces.push_back(line); rightSurfaces.push_back(line);
i++; 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;
} }

View File

@@ -149,6 +149,18 @@ public:
// Obten la coordenada de la cuesta a partir de un punto perteneciente a ese tile // Obten la coordenada de la cuesta a partir de un punto perteneciente a ese tile
int getSlopeHeight(SDL_Point p, tile_e slope); 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 #endif