diff --git a/source/game.cpp b/source/game.cpp index 9f38a90..2e66d06 100644 --- a/source/game.cpp +++ b/source/game.cpp @@ -115,7 +115,7 @@ void Game::update() mRoom->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(); checkPlayerOnFloor(); } @@ -211,7 +211,7 @@ void Game::checkPlayerOnFloor() { mPlayer->setStatus(STATUS_STANDING); } - else + else if (mPlayer->getStatus() != STATUS_JUMPING) { mPlayer->setStatus(STATUS_FALLING); } @@ -220,8 +220,7 @@ void Game::checkPlayerOnFloor() // Comprueba que el jugador no atraviese ninguna pared void Game::checkPlayerAndWalls() { - // Hayque comprobar las cuatro esquinas del tile superior - // y las cuatro del tile inferior + // Comprueba las cuatro esquinas de los dos tiles del jugador SDL_Rect rect = mPlayer->getRect(); SDL_Point p1 = {rect.x, rect.y}; SDL_Point p2 = {rect.x + 7, rect.y}; @@ -244,7 +243,8 @@ void Game::checkPlayerAndWalls() if (test) { + // Si hay colisión, deshace el movimiento y lo pone en modo caída mPlayer->undoLastMove(); - // mPlayer->setStatus(STATUS_STANDING); + mPlayer->setStatus(STATUS_FALLING); } } \ No newline at end of file diff --git a/source/player.cpp b/source/player.cpp index b26b511..9ebecf6 100644 --- a/source/player.cpp +++ b/source/player.cpp @@ -70,30 +70,29 @@ void Player::draw() // Actualiza las variables del objeto void Player::update() { - setLastPosition(); - checkInput(); - sprite->update(); - checkBorders(); - applyGravity(); + + setLastPosition(); // Guarda la posición actual en la variable lastPosition + checkInput(); // Comprueba las entradas y modifica variables + move(); // Recalcula la posición del jugador y su animación + 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 void Player::checkInput() { - // Se mueve en horizontal solo cuando no esté cayendo - if ((input->checkInput(INPUT_LEFT, REPEAT_TRUE)) && (status != STATUS_FALLING)) + // Solo comprueba las entradas de dirección cuando está de pie + if ((input->checkInput(INPUT_LEFT, REPEAT_TRUE)) && (status == STATUS_STANDING)) { sprite->setVelX(-0.6f); - sprite->animate(0); 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->animate(0); sprite->setFlip(SDL_FLIP_NONE); } - else + else if (status == STATUS_STANDING) { sprite->setVelX(0); } @@ -116,7 +115,7 @@ int Player::getBorder() 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() { if (sprite->getPosX() < PLAY_AREA_LEFT) @@ -198,14 +197,15 @@ void Player::setStatus(int value) sprite->setVelY(-2.0f); } - // Si se quiere cambiar a cayendo, ha de ser desde quieto - if ((value == STATUS_FALLING) && (status == STATUS_STANDING)) + // Modifica el estado a 'cayendo' + if (value == STATUS_FALLING) { status = STATUS_FALLING; 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) { 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 void Player::applyGravity() { @@ -245,4 +251,14 @@ void Player::undoLastMove() { sprite->setPosX(lastPosition.x); sprite->setPosY(lastPosition.y); -} \ No newline at end of file +} + +// Recalcula la posición del jugador y su animación +void Player::move() +{ + sprite->update(); + if (sprite->getVelX() != 0) + { + sprite->animate(0); + } +} diff --git a/source/player.h b/source/player.h index ac8906c..cd6bf9d 100644 --- a/source/player.h +++ b/source/player.h @@ -48,8 +48,11 @@ private: // Guarda la posición actual en la variable lastPosition void setLastPosition(); + // Recalcula la posición del jugador y su animación + void move(); + 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 Player(std::string _tileset, SDL_Renderer *_renderer, Asset *_asset, Input *_input, Room *_room); @@ -84,6 +87,9 @@ public: // Cambia el estado del jugador void setStatus(int value); + // Obtiene el estado del jugador + int getStatus(); + // Obtiene el rectangulo que delimita al jugador SDL_Rect getRect();