forked from jaildesigner-jailgames/jaildoctors_dilemma
Las superficies automaticas ya arrastran. Falta definir el sentido y la animación
This commit is contained in:
@@ -21,6 +21,7 @@ Player::Player(player_t ini, std::string tileset, std::string animation, SDL_Ren
|
||||
onBorder = false;
|
||||
border = BORDER_TOP;
|
||||
invincible = true;
|
||||
autoMovement = false;
|
||||
alive = true;
|
||||
maxFallHeight = BLOCK * 4;
|
||||
paused = false;
|
||||
@@ -151,29 +152,41 @@ void Player::update()
|
||||
// Comprueba las entradas y modifica variables
|
||||
void Player::checkInput()
|
||||
{
|
||||
// Solo comprueba las entradas de dirección cuando está dsobre una superficie
|
||||
// Solo comprueba las entradas de dirección cuando está sobre una superficie
|
||||
if (state != s_standing)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (input->checkInput(INPUT_LEFT, REPEAT_TRUE))
|
||||
{
|
||||
vx = -0.6f;
|
||||
sprite->setFlip(SDL_FLIP_HORIZONTAL);
|
||||
}
|
||||
if (!autoMovement)
|
||||
{ // Comprueba las entradas de desplazamiento lateral solo en el caso de no estar enganchado a una superficie automatica
|
||||
if (input->checkInput(INPUT_LEFT, REPEAT_TRUE))
|
||||
{
|
||||
vx = -0.6f;
|
||||
sprite->setFlip(SDL_FLIP_HORIZONTAL);
|
||||
}
|
||||
|
||||
else if (input->checkInput(INPUT_RIGHT, REPEAT_TRUE))
|
||||
{
|
||||
else if (input->checkInput(INPUT_RIGHT, REPEAT_TRUE))
|
||||
{
|
||||
vx = 0.6f;
|
||||
sprite->setFlip(SDL_FLIP_NONE);
|
||||
}
|
||||
|
||||
else
|
||||
{ // No se pulsa ninguna dirección
|
||||
vx = 0.0f;
|
||||
if (isOnAutoSurface())
|
||||
{ // Si deja de moverse sobre una superficie se engancha
|
||||
autoMovement = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{ // El movimiento lo proporciona la superficie
|
||||
vx = 0.6f;
|
||||
sprite->setFlip(SDL_FLIP_NONE);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
vx = 0.0f;
|
||||
}
|
||||
|
||||
if (input->checkInput(INPUT_UP, REPEAT_TRUE))
|
||||
{
|
||||
setState(s_jumping);
|
||||
@@ -407,6 +420,9 @@ void Player::move()
|
||||
if (state == s_standing && !isOnFloor())
|
||||
{
|
||||
setState(s_falling);
|
||||
|
||||
// Deja de estar enganchado a la superficie automatica
|
||||
autoMovement = false;
|
||||
}
|
||||
|
||||
// Se mueve hacia arriba
|
||||
@@ -448,12 +464,15 @@ void Player::move()
|
||||
|
||||
r = proj;
|
||||
|
||||
// Comprueba la colisión con los muros
|
||||
const int pos = room->checkTopSurfaces(&proj);
|
||||
// Comprueba la colisión con las superficies normales y las automáticas
|
||||
const int pos = std::max(room->checkTopSurfaces(&proj), room->checkAutoSurfaces(&proj));
|
||||
if (pos > -1)
|
||||
{ // Si hay colisión lo mueve hasta donde no colisiona y pasa a estar sobre el suelo
|
||||
{ // Si hay colisión lo mueve hasta donde no colisiona y pasa a estar sobre la superficie
|
||||
y = pos - h;
|
||||
setState(s_standing);
|
||||
|
||||
// Deja de estar enganchado a la superficie automatica
|
||||
autoMovement = false;
|
||||
}
|
||||
else
|
||||
{ // Si no hay colisión con los muros, comprueba la colisión con las rampas
|
||||
@@ -466,7 +485,7 @@ void Player::move()
|
||||
{ // No está saltando y hay colisión con una rampa
|
||||
// Calcula la nueva posición
|
||||
y = p - h;
|
||||
setState(s_standing);
|
||||
setState(s_standing);
|
||||
}
|
||||
else
|
||||
{ // No está saltando y no hay colisón con una rampa
|
||||
@@ -548,6 +567,7 @@ bool Player::isOnFloor()
|
||||
for (auto f : underFeet)
|
||||
{
|
||||
onFloor |= room->checkTopSurfaces(&f);
|
||||
onFloor |= room->checkAutoSurfaces(&f);
|
||||
}
|
||||
|
||||
// Comprueba las rampas
|
||||
@@ -572,6 +592,27 @@ bool Player::isOnFloor()
|
||||
return onFloor || onSlopeL || onSlopeR;
|
||||
}
|
||||
|
||||
// Comprueba si el jugador esta sobre una superficie automática
|
||||
bool Player::isOnAutoSurface()
|
||||
{
|
||||
bool onAutoSurface = false;
|
||||
|
||||
updateFeet();
|
||||
|
||||
// Comprueba las superficies
|
||||
for (auto f : underFeet)
|
||||
{
|
||||
onAutoSurface |= room->checkAutoSurfaces(&f);
|
||||
}
|
||||
|
||||
if (onAutoSurface)
|
||||
{
|
||||
debug->add("ON_AUTO_SURFACE");
|
||||
}
|
||||
|
||||
return onAutoSurface;
|
||||
}
|
||||
|
||||
// Comprueba si el jugador está sobre una rampa hacia abajo
|
||||
bool Player::isOnDownSlope()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user