forked from jaildesigner-jailgames/jaildoctors_dilemma
Trabajando en las colisiones y estados
This commit is contained in:
@@ -77,7 +77,12 @@ void Player::update()
|
||||
// Comprueba las entradas y modifica variables
|
||||
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))
|
||||
{
|
||||
vx = -0.6f;
|
||||
@@ -189,8 +194,8 @@ void Player::applyGravity()
|
||||
{
|
||||
const float gf = 0.035f;
|
||||
|
||||
// La gravedad solo se aplica cuando está saltando
|
||||
if (state == s_jumping)
|
||||
// La gravedad solo se aplica cuando no está sobre una superficie
|
||||
if (!isOnFloor())
|
||||
{
|
||||
vy += gf;
|
||||
if (vy > maxVY)
|
||||
@@ -221,8 +226,112 @@ void Player::move()
|
||||
applyGravity(); // Aplica gravedad al 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
|
||||
x += vx;
|
||||
/*x += vx;
|
||||
|
||||
// Comprueba colisiones con muros
|
||||
if (checkWalls())
|
||||
@@ -358,7 +467,7 @@ void Player::move()
|
||||
vy = 0.0f;
|
||||
}
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
// Actualiza la posición del sprite
|
||||
sprite->setPosX(x);
|
||||
@@ -396,9 +505,11 @@ bool Player::isOnFloor()
|
||||
for (auto f : underFeet)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user