Ya realiza bien las colisiones en el salto

This commit is contained in:
2022-07-10 18:49:26 +02:00
parent 216fc1e19c
commit f931890e95
3 changed files with 44 additions and 22 deletions

View File

@@ -115,7 +115,7 @@ void Game::update()
mRoom->update(); mRoom->update();
mPlayer->update(); mPlayer->update();
checkPlayerAndWalls(); // Debe ir detras del player update, por si se ha metido en algun muro, sacarlo checkPlayerAndWalls(); // Debe ir detras del player update, por si se ha metido en algun muro
checkPlayerOnBorder(); checkPlayerOnBorder();
checkPlayerOnFloor(); checkPlayerOnFloor();
} }
@@ -211,7 +211,7 @@ void Game::checkPlayerOnFloor()
{ {
mPlayer->setStatus(STATUS_STANDING); mPlayer->setStatus(STATUS_STANDING);
} }
else else if (mPlayer->getStatus() != STATUS_JUMPING)
{ {
mPlayer->setStatus(STATUS_FALLING); mPlayer->setStatus(STATUS_FALLING);
} }
@@ -220,8 +220,7 @@ void Game::checkPlayerOnFloor()
// Comprueba que el jugador no atraviese ninguna pared // Comprueba que el jugador no atraviese ninguna pared
void Game::checkPlayerAndWalls() void Game::checkPlayerAndWalls()
{ {
// Hayque comprobar las cuatro esquinas del tile superior // Comprueba las cuatro esquinas de los dos tiles del jugador
// y las cuatro del tile inferior
SDL_Rect rect = mPlayer->getRect(); SDL_Rect rect = mPlayer->getRect();
SDL_Point p1 = {rect.x, rect.y}; SDL_Point p1 = {rect.x, rect.y};
SDL_Point p2 = {rect.x + 7, rect.y}; SDL_Point p2 = {rect.x + 7, rect.y};
@@ -244,7 +243,8 @@ void Game::checkPlayerAndWalls()
if (test) if (test)
{ {
// Si hay colisión, deshace el movimiento y lo pone en modo caída
mPlayer->undoLastMove(); mPlayer->undoLastMove();
// mPlayer->setStatus(STATUS_STANDING); mPlayer->setStatus(STATUS_FALLING);
} }
} }

View File

@@ -70,30 +70,29 @@ void Player::draw()
// Actualiza las variables del objeto // Actualiza las variables del objeto
void Player::update() void Player::update()
{ {
setLastPosition();
checkInput(); setLastPosition(); // Guarda la posición actual en la variable lastPosition
sprite->update(); checkInput(); // Comprueba las entradas y modifica variables
checkBorders(); move(); // Recalcula la posición del jugador y su animación
applyGravity(); checkBorders(); // Comprueba si está situado en alguno de los cuatro bordes de la habitación
applyGravity(); // Aplica gravedad al jugador
} }
// Comprueba las entradas y modifica variables // Comprueba las entradas y modifica variables
void Player::checkInput() void Player::checkInput()
{ {
// Se mueve en horizontal solo cuando no esté cayendo // Solo comprueba las entradas de dirección cuando está de pie
if ((input->checkInput(INPUT_LEFT, REPEAT_TRUE)) && (status != STATUS_FALLING)) if ((input->checkInput(INPUT_LEFT, REPEAT_TRUE)) && (status == STATUS_STANDING))
{ {
sprite->setVelX(-0.6f); sprite->setVelX(-0.6f);
sprite->animate(0);
sprite->setFlip(SDL_FLIP_HORIZONTAL); sprite->setFlip(SDL_FLIP_HORIZONTAL);
} }
else if ((input->checkInput(INPUT_RIGHT, REPEAT_TRUE)) && (status != STATUS_FALLING)) else if ((input->checkInput(INPUT_RIGHT, REPEAT_TRUE)) && (status == STATUS_STANDING))
{ {
sprite->setVelX(0.6f); sprite->setVelX(0.6f);
sprite->animate(0);
sprite->setFlip(SDL_FLIP_NONE); sprite->setFlip(SDL_FLIP_NONE);
} }
else else if (status == STATUS_STANDING)
{ {
sprite->setVelX(0); sprite->setVelX(0);
} }
@@ -116,7 +115,7 @@ int Player::getBorder()
return border; return border;
} }
// Comprueba si está situado en alguno de los cuatro bordes // Comprueba si está situado en alguno de los cuatro bordes de la habitación
void Player::checkBorders() void Player::checkBorders()
{ {
if (sprite->getPosX() < PLAY_AREA_LEFT) if (sprite->getPosX() < PLAY_AREA_LEFT)
@@ -198,14 +197,15 @@ void Player::setStatus(int value)
sprite->setVelY(-2.0f); sprite->setVelY(-2.0f);
} }
// Si se quiere cambiar a cayendo, ha de ser desde quieto // Modifica el estado a 'cayendo'
if ((value == STATUS_FALLING) && (status == STATUS_STANDING)) if (value == STATUS_FALLING)
{ {
status = STATUS_FALLING; status = STATUS_FALLING;
sprite->setVelY(0.5f); sprite->setVelY(0.5f);
sprite->setVelX(0);
} }
// Si se quiere cambiar a quieto, no hay resticciones // Modifica el estado a 'de pie'
if (value == STATUS_STANDING) if (value == STATUS_STANDING)
{ {
status = STATUS_STANDING; status = STATUS_STANDING;
@@ -213,6 +213,12 @@ void Player::setStatus(int value)
} }
} }
// Obtiene el estado del jugador
int Player::getStatus()
{
return status;
}
// Aplica gravedad al jugador // Aplica gravedad al jugador
void Player::applyGravity() void Player::applyGravity()
{ {
@@ -245,4 +251,14 @@ void Player::undoLastMove()
{ {
sprite->setPosX(lastPosition.x); sprite->setPosX(lastPosition.x);
sprite->setPosY(lastPosition.y); sprite->setPosY(lastPosition.y);
} }
// Recalcula la posición del jugador y su animación
void Player::move()
{
sprite->update();
if (sprite->getVelX() != 0)
{
sprite->animate(0);
}
}

View File

@@ -48,8 +48,11 @@ private:
// Guarda la posición actual en la variable lastPosition // Guarda la posición actual en la variable lastPosition
void setLastPosition(); void setLastPosition();
// Recalcula la posición del jugador y su animación
void move();
public: public:
int status; // Estado en el que se encuentra el jugador. Util apara saber si está saltando o cayendo int status; // Estado en el que se encuentra el jugador. Util apara saber si está saltando o cayendo
// Constructor // Constructor
Player(std::string _tileset, SDL_Renderer *_renderer, Asset *_asset, Input *_input, Room *_room); Player(std::string _tileset, SDL_Renderer *_renderer, Asset *_asset, Input *_input, Room *_room);
@@ -84,6 +87,9 @@ public:
// Cambia el estado del jugador // Cambia el estado del jugador
void setStatus(int value); void setStatus(int value);
// Obtiene el estado del jugador
int getStatus();
// Obtiene el rectangulo que delimita al jugador // Obtiene el rectangulo que delimita al jugador
SDL_Rect getRect(); SDL_Rect getRect();