Colision con el suelo terminada

This commit is contained in:
2022-07-06 21:04:45 +02:00
parent edba97cfc7
commit 90bbe77f39
6 changed files with 82 additions and 10 deletions

View File

@@ -12,7 +12,7 @@ Game::Game(SDL_Window *window, SDL_Renderer *renderer, Asset *asset, Lang *lang,
// Crea los objetos // Crea los objetos
mScreen = new Screen(window, renderer); mScreen = new Screen(window, renderer);
mRoom = new Room(mAsset->get("01.room"), mRenderer, mAsset); mRoom = new Room(mAsset->get("01.room"), mRenderer, mAsset);
mPlayer = new Player(mAsset->get("player01.png"), mRenderer, mAsset, mInput); mPlayer = new Player(mAsset->get("player01.png"), mRenderer, mAsset, mInput, mRoom);
mEventHandler = new SDL_Event(); mEventHandler = new SDL_Event();
mTextureText = new LTexture(); mTextureText = new LTexture();
mText = new Text(mAsset->get("smb2.txt"), mTextureText, renderer); mText = new Text(mAsset->get("smb2.txt"), mTextureText, renderer);
@@ -117,6 +117,7 @@ void Game::update()
mRoom->update(); mRoom->update();
mPlayer->update(); mPlayer->update();
checkPlayerOnBorder(); checkPlayerOnBorder();
checkPlayerOnFloor();
} }
} }
@@ -175,6 +176,9 @@ bool Game::changeRoom(std::string file)
// Crea un objeto habitación nuevo a partir del fichero // Crea un objeto habitación nuevo a partir del fichero
mRoom = new Room(mAsset->get(file), mRenderer, mAsset); mRoom = new Room(mAsset->get(file), mRenderer, mAsset);
// Comunica al jugador la nueva referencia para la habitación
mPlayer->setRoom(mRoom);
success = true; success = true;
} }
@@ -189,4 +193,18 @@ void Game::checkPlayerOnBorder()
changeRoom(mRoom->getRoom(mPlayer->getBorder())); changeRoom(mRoom->getRoom(mPlayer->getBorder()));
mPlayer->switchBorders(); mPlayer->switchBorders();
} }
}
// Comprueba si el jugador esta sobre el suelo
void Game::checkPlayerOnFloor()
{
// Comprueba ambos pies
if ((mRoom->isFloor(mPlayer->getLeftFoot())) || (mRoom->isFloor(mPlayer->getRightFoot())))
{
mPlayer->setFalling(false);
}
else
{
mPlayer->setFalling(true);
}
} }

View File

@@ -59,6 +59,9 @@ private:
// Comprueba si el jugador esta en el borde de la pantalla y actua // Comprueba si el jugador esta en el borde de la pantalla y actua
void checkPlayerOnBorder(); void checkPlayerOnBorder();
// Comprueba si el jugador esta sobre el suelo
void checkPlayerOnFloor();
public: public:
// Constructor // Constructor
Game(SDL_Window *window, SDL_Renderer *renderer, Asset *asset, Lang *lang, Input *input); Game(SDL_Window *window, SDL_Renderer *renderer, Asset *asset, Lang *lang, Input *input);

View File

@@ -3,12 +3,13 @@
#include <sstream> #include <sstream>
// Constructor // Constructor
Player::Player(std::string _tileset, SDL_Renderer *_renderer, Asset *_asset, Input *_input) Player::Player(std::string _tileset, SDL_Renderer *_renderer, Asset *_asset, Input *_input, Room *_room)
{ {
// Obten punteros a objetos // Obten punteros a objetos
asset = _asset; asset = _asset;
renderer = _renderer; renderer = _renderer;
input = _input; input = _input;
room = _room;
// Crea objetos // Crea objetos
texture = new LTexture(); texture = new LTexture();
@@ -23,7 +24,9 @@ Player::Player(std::string _tileset, SDL_Renderer *_renderer, Asset *_asset, Inp
border = BORDER_TOP; border = BORDER_TOP;
sprite->setPosX(2 * 8); sprite->setPosX(2 * 8);
sprite->setPosX(10 * 8);
sprite->setPosY(12 * 8); sprite->setPosY(12 * 8);
sprite->setPosY(6 * 8);
sprite->setVelX(0); sprite->setVelX(0);
sprite->setVelY(0); sprite->setVelY(0);
sprite->setWidth(8); sprite->setWidth(8);
@@ -108,7 +111,7 @@ int Player::getBorder()
return border; return border;
} }
// Comprueba si se halla en alguno de los cuatro bordes // Comprueba si está situado en alguno de los cuatro bordes
void Player::checkBorders() void Player::checkBorders()
{ {
if (sprite->getPosX() < PLAY_AREA_LEFT) if (sprite->getPosX() < PLAY_AREA_LEFT)
@@ -158,4 +161,37 @@ void Player::switchBorders()
} }
onBorder = false; onBorder = false;
}
// Establece el valor de la variable
void Player::setRoom(Room *_room)
{
room = _room;
}
// Obtiene el valor del pixel inferior izquierdo del jugador
SDL_Point Player::getLeftFoot()
{
SDL_Point point = {(int)sprite->getPosX(), (int)sprite->getPosY() + sprite->getHeight()};
return point;
}
// Obtiene el valor del pixel inferior derecho del jugador
SDL_Point Player::getRightFoot()
{
SDL_Point point = {(int)sprite->getPosX() + sprite->getWidth(), (int)sprite->getPosY() + sprite->getHeight()};
return point;
}
// Establece la velocidad en el eje Y al jugador
void Player::setFalling(bool value)
{
if (value)
{
sprite->setVelY(0.5f);
}
else
{
sprite->setVelY(0.0f);
}
} }

View File

@@ -3,6 +3,7 @@
#include "const.h" #include "const.h"
#include "utils.h" #include "utils.h"
#include "asset.h" #include "asset.h"
#include "room.h"
#include "animatedsprite.h" #include "animatedsprite.h"
#include "input.h" #include "input.h"
#include <string> #include <string>
@@ -18,7 +19,8 @@ class Player
private: private:
LTexture *texture; // Textura con los graficos del enemigo LTexture *texture; // Textura con los graficos del enemigo
AnimatedSprite *sprite; // Sprite del enemigo AnimatedSprite *sprite; // Sprite del enemigo
Input *input; // Objeto para gestyionar la entrada Input *input; // Objeto para gestionar la entrada
Room *room; // Objeto con el mapa del juego
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
@@ -35,7 +37,7 @@ private:
public: public:
// Constructor // Constructor
Player(std::string _tileset, SDL_Renderer *_renderer, Asset *_asset, Input *_input); Player(std::string _tileset, SDL_Renderer *_renderer, Asset *_asset, Input *_input, Room *_room);
// Destructor // Destructor
~Player(); ~Player();
@@ -54,6 +56,18 @@ public:
// Cambia al jugador de un borde al opuesto. Util para el cambio de pantalla // Cambia al jugador de un borde al opuesto. Util para el cambio de pantalla
void switchBorders(); void switchBorders();
// Establece el valor de la variable
void setRoom(Room *_room);
// Obtiene el valor del pixel inferior izquierdo del jugador
SDL_Point getLeftFoot();
// Obtiene el valor del pixel inferior derecho del jugador
SDL_Point getRightFoot();
// Establece la velocidad en el eje Y al jugador
void setFalling(bool value);
}; };
#endif #endif

View File

@@ -308,10 +308,11 @@ std::string Room::getRoom(int border)
return ""; return "";
} }
// Dice si el tile al que pertenece el pixel es sólido o no // Indica si el tile al que pertenece el pixel es sólido o no
bool Room::isSolid(int x, int y) bool Room::isFloor(SDL_Point point)
{ {
int tile = ((y / 8) * 32) + (x / 8); int tile = ((point.y / 8) * 32) + (point.x / 8);
if (tile < 512) if (tile < 512)
{ {
if (tilemap[tile] != 0) if (tilemap[tile] != 0)

View File

@@ -81,8 +81,8 @@ public:
// Devuelve la cadena del fichero de la habitación contigua segun el borde // Devuelve la cadena del fichero de la habitación contigua segun el borde
std::string getRoom(int border); std::string getRoom(int border);
// Dice si el tile al que pertenece el pixel es sólido o no // Indica si el tile al que pertenece el pixel es sólido o no
bool isSolid(int x, int y); bool isFloor(SDL_Point point);
}; };
#endif #endif