Trabajando en las colisiones con el mapeado

This commit is contained in:
2022-07-07 17:44:22 +02:00
parent 90bbe77f39
commit 9ecab3ea59
3 changed files with 70 additions and 15 deletions

View File

@@ -201,10 +201,10 @@ void Game::checkPlayerOnFloor()
// Comprueba ambos pies // Comprueba ambos pies
if ((mRoom->isFloor(mPlayer->getLeftFoot())) || (mRoom->isFloor(mPlayer->getRightFoot()))) if ((mRoom->isFloor(mPlayer->getLeftFoot())) || (mRoom->isFloor(mPlayer->getRightFoot())))
{ {
mPlayer->setFalling(false); mPlayer->setStatus(STATUS_STANDING);
} }
else else
{ {
mPlayer->setFalling(true); mPlayer->setStatus(STATUS_FALLING);
} }
} }

View File

@@ -2,6 +2,8 @@
#include <fstream> #include <fstream>
#include <sstream> #include <sstream>
// CAUTION!!!!! si no se gasta al final, quitar la referencia a la habitación
// Constructor // Constructor
Player::Player(std::string _tileset, SDL_Renderer *_renderer, Asset *_asset, Input *_input, Room *_room) Player::Player(std::string _tileset, SDL_Renderer *_renderer, Asset *_asset, Input *_input, Room *_room)
{ {
@@ -22,6 +24,7 @@ Player::Player(std::string _tileset, SDL_Renderer *_renderer, Asset *_asset, Inp
color = stringToColor("white"); color = stringToColor("white");
onBorder = false; onBorder = false;
border = BORDER_TOP; border = BORDER_TOP;
status = STATUS_STANDING;
sprite->setPosX(2 * 8); sprite->setPosX(2 * 8);
sprite->setPosX(10 * 8); sprite->setPosX(10 * 8);
@@ -67,8 +70,8 @@ void Player::update()
{ {
checkInput(); checkInput();
sprite->update(); sprite->update();
// sprite->animate(0);
checkBorders(); checkBorders();
applyGravity();
} }
// Comprueba las entradas y modifica variables // Comprueba las entradas y modifica variables
@@ -80,16 +83,16 @@ void Player::checkInput()
// if (mInput->checkInput(INPUT_DOWN, REPEAT_FALSE)) // if (mInput->checkInput(INPUT_DOWN, REPEAT_FALSE))
// changeRoom(mRoom->getRoomDown()); // changeRoom(mRoom->getRoomDown());
if (input->checkInput(INPUT_LEFT, REPEAT_TRUE)) // Se mueve en horizontal solo cuando no esté cayendo
if ((input->checkInput(INPUT_LEFT, REPEAT_TRUE)) && (status != STATUS_FALLING))
{ {
sprite->setVelX(-VX); sprite->setVelX(-0.6f);
sprite->animate(0); 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))
{ {
sprite->setVelX(VX); sprite->setVelX(0.6f);
sprite->animate(0); sprite->animate(0);
sprite->setFlip(SDL_FLIP_NONE); sprite->setFlip(SDL_FLIP_NONE);
} }
@@ -97,6 +100,11 @@ void Player::checkInput()
{ {
sprite->setVelX(0); sprite->setVelX(0);
} }
if (input->checkInput(INPUT_UP, REPEAT_FALSE))
{
setStatus(STATUS_JUMPING);
}
} }
// Indica si el jugador esta en uno de los cuatro bordes de la pantalla // Indica si el jugador esta en uno de los cuatro bordes de la pantalla
@@ -183,15 +191,48 @@ SDL_Point Player::getRightFoot()
return point; return point;
} }
// Establece la velocidad en el eje Y al jugador // Cambia el estado del jugador
void Player::setFalling(bool value) void Player::setStatus(int value)
{ {
if (value) // Si quiere cambiar a saltando, ha de ser desde quieto
if ((value == STATUS_JUMPING) && (status == STATUS_STANDING))
{ {
status = STATUS_JUMPING;
sprite->setVelY(-2.0f);
}
// Si se quiere cambiar a cayendo, ha de ser desde quieto
if ((value == STATUS_FALLING) && (status == STATUS_STANDING))
{
status = STATUS_FALLING;
sprite->setVelY(0.5f); sprite->setVelY(0.5f);
} }
else
// Si se quiere cambiar a quieto, no hay resticciones
if (value == STATUS_STANDING)
{ {
status = STATUS_STANDING;
sprite->setVelY(0.0f); sprite->setVelY(0.0f);
} }
}
// Aplica gravedad al jugador
void Player::applyGravity()
{
if (status == STATUS_JUMPING)
{
sprite->setVelY(sprite->getVelY() + 0.1f);
if (sprite->getVelY() > 0.5f)
{
sprite->setVelY(0.5f);
// status = STATUS_FALLING;
}
}
}
// Obtiene el rectangulo que delimita al jugador
SDL_Rect Player::getRect()
{
SDL_Rect rect = {sprite->getPosX(), sprite->getPosY(), sprite->getWidth(), sprite->getHeight()};
return rect;
} }

View File

@@ -11,7 +11,10 @@
#ifndef PLAYER_H #ifndef PLAYER_H
#define PLAYER_H #define PLAYER_H
#define VX 0.6 //#define VX 0.6
#define STATUS_STANDING 0
#define STATUS_JUMPING 1
#define STATUS_FALLING 2
// Clase Player // Clase Player
class Player class Player
@@ -25,6 +28,8 @@ private:
SDL_Renderer *renderer; // El renderizador de la ventana SDL_Renderer *renderer; // El renderizador de la ventana
Asset *asset; // Objeto con la ruta a todos los ficheros de recursos Asset *asset; // Objeto con la ruta a todos los ficheros de recursos
color_t color; // Color del jugador color_t color; // Color del jugador
int status; // Estado en el que se encuentra el jugador. Util apara saber si está saltando o cayendo
SDL_Rect lastPosition; // Contiene la ultima posición del jugador, por si hay que deshacer algun movimiento
bool onBorder; // Indica si el jugador esta en uno de los cuatro bordes de la pantalla bool onBorder; // Indica si el jugador esta en uno de los cuatro bordes de la pantalla
int border; // Indica en cual de los cuatro bordes se encuentra int border; // Indica en cual de los cuatro bordes se encuentra
@@ -35,6 +40,12 @@ private:
// Comprueba si se halla en alguno de los cuatro bordes // Comprueba si se halla en alguno de los cuatro bordes
void checkBorders(); void checkBorders();
// Asigna velocidad negativa en el eje Y al jugador
void jump();
// Aplica gravedad al jugador
void applyGravity();
public: public:
// 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);
@@ -66,8 +77,11 @@ public:
// Obtiene el valor del pixel inferior derecho del jugador // Obtiene el valor del pixel inferior derecho del jugador
SDL_Point getRightFoot(); SDL_Point getRightFoot();
// Establece la velocidad en el eje Y al jugador // Cambia el estado del jugador
void setFalling(bool value); void setStatus(int value);
// Obtiene el rectangulo que delimita al jugador
SDL_Rect getRect();
}; };
#endif #endif