Ya sube las rampas. Aun queda por acabar

This commit is contained in:
2022-09-10 18:26:24 +02:00
parent 2ccb02258c
commit edaa59af7d
10 changed files with 386 additions and 11 deletions

View File

@@ -49,6 +49,8 @@ Player::Player(player_t ini, std::string tileset, std::string animation, SDL_Ren
colliderPoints.insert(colliderPoints.end(), {p, p, p, p, p, p, p, p});
underFeet.insert(underFeet.end(), {p, p});
feet.insert(feet.end(), {p, p});
line = {0, 0, 0, 0};
}
// Destructor
@@ -68,6 +70,8 @@ void Player::render()
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 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);
}
}
@@ -243,7 +247,7 @@ void Player::move()
proj.h = h - 1;
proj.w = ceil(abs(vx)); // Para evitar que tenga un ancho de 0 pixels
// Comprueba la colisión
// Comprueba la colisión con las superficies
const int pos = room->checkRightSurfaces(&proj);
// Calcula la nueva posición
@@ -255,6 +259,15 @@ void Player::move()
{ // Si hay colisión lo mueve hasta donde no colisiona
x = pos + 1;
}
// Si ha tocado alguna rampa, asciende
v_line_t leftSide = {(int)x, (int)y, (int)y + h - 1};
const int ly = room->checkLeftSlopes(&leftSide);
if (ly > -1)
{
y = ly - h;
setState(s_standing);
}
}
// Se mueve hacia la derecha
@@ -279,6 +292,15 @@ void Player::move()
{ // Si hay colisión lo mueve hasta donde no colisiona
x = pos - w;
}
// Si ha tocado alguna rampa, asciende
v_line_t rightSide = {(int)x + w - 1, (int)y, (int)y + h - 1};
const int ry = room->checkRightSlopes(&rightSide);
if (ry > -1)
{
y = ry - h;
setState(s_standing);
}
}
// Si ha salido del suelo, el jugador cae
@@ -313,7 +335,7 @@ void Player::move()
}
// Se mueve hacia abajo
if (vy > 0.0f)
else if (vy > 0.0f)
{
// Crea el rectangulo de proyección en el eje X para ver si colisiona
SDL_Rect proj;
@@ -322,7 +344,7 @@ void Player::move()
proj.h = ceil(vy); // Para evitar que tenga una altura de 0 pixels
proj.w = w - 1;
// Comprueba la colisión
// Comprueba la colisión con los muros
const int pos = room->checkTopSurfaces(&proj);
// Calcula la nueva posición
@@ -511,11 +533,16 @@ bool Player::isOnFloor()
updateFeet();
// Comprueba las superficies
for (auto f : underFeet)
{
onFloor |= room->checkTopSurfaces(&f);
}
// Comprueba las rampas
onFloor |= room->checkLeftSlopes(&underFeet[0]);
onFloor |= room->checkRightSlopes(&underFeet[1]);
if (onFloor)
{
debug->add("ONFLOOR");