diff --git a/source/game.cpp b/source/game.cpp index 38af08b..28cf408 100644 --- a/source/game.cpp +++ b/source/game.cpp @@ -12,7 +12,7 @@ Game::Game(SDL_Window *window, SDL_Renderer *renderer, Asset *asset, Lang *lang, // Crea los objetos mScreen = new Screen(window, renderer); 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(); mTextureText = new LTexture(); mText = new Text(mAsset->get("smb2.txt"), mTextureText, renderer); @@ -117,6 +117,7 @@ void Game::update() mRoom->update(); mPlayer->update(); checkPlayerOnBorder(); + checkPlayerOnFloor(); } } @@ -175,6 +176,9 @@ bool Game::changeRoom(std::string file) // Crea un objeto habitación nuevo a partir del fichero mRoom = new Room(mAsset->get(file), mRenderer, mAsset); + // Comunica al jugador la nueva referencia para la habitación + mPlayer->setRoom(mRoom); + success = true; } @@ -189,4 +193,18 @@ void Game::checkPlayerOnBorder() changeRoom(mRoom->getRoom(mPlayer->getBorder())); 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); + } } \ No newline at end of file diff --git a/source/game.h b/source/game.h index b130483..072b055 100644 --- a/source/game.h +++ b/source/game.h @@ -59,6 +59,9 @@ private: // Comprueba si el jugador esta en el borde de la pantalla y actua void checkPlayerOnBorder(); + // Comprueba si el jugador esta sobre el suelo + void checkPlayerOnFloor(); + public: // Constructor Game(SDL_Window *window, SDL_Renderer *renderer, Asset *asset, Lang *lang, Input *input); diff --git a/source/player.cpp b/source/player.cpp index f2e1545..71a9fa2 100644 --- a/source/player.cpp +++ b/source/player.cpp @@ -3,12 +3,13 @@ #include // 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 asset = _asset; renderer = _renderer; input = _input; + room = _room; // Crea objetos texture = new LTexture(); @@ -23,7 +24,9 @@ Player::Player(std::string _tileset, SDL_Renderer *_renderer, Asset *_asset, Inp border = BORDER_TOP; sprite->setPosX(2 * 8); + sprite->setPosX(10 * 8); sprite->setPosY(12 * 8); + sprite->setPosY(6 * 8); sprite->setVelX(0); sprite->setVelY(0); sprite->setWidth(8); @@ -108,7 +111,7 @@ int Player::getBorder() 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() { if (sprite->getPosX() < PLAY_AREA_LEFT) @@ -158,4 +161,37 @@ void Player::switchBorders() } 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); + } } \ No newline at end of file diff --git a/source/player.h b/source/player.h index 26dd8ee..ac26bac 100644 --- a/source/player.h +++ b/source/player.h @@ -3,6 +3,7 @@ #include "const.h" #include "utils.h" #include "asset.h" +#include "room.h" #include "animatedsprite.h" #include "input.h" #include @@ -18,7 +19,8 @@ class Player private: LTexture *texture; // Textura con los graficos 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 Asset *asset; // Objeto con la ruta a todos los ficheros de recursos @@ -35,7 +37,7 @@ private: public: // 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 ~Player(); @@ -54,6 +56,18 @@ public: // Cambia al jugador de un borde al opuesto. Util para el cambio de pantalla 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 diff --git a/source/room.cpp b/source/room.cpp index e5f295a..f01075a 100644 --- a/source/room.cpp +++ b/source/room.cpp @@ -308,10 +308,11 @@ std::string Room::getRoom(int border) return ""; } -// Dice si el tile al que pertenece el pixel es sólido o no -bool Room::isSolid(int x, int y) +// Indica si el tile al que pertenece el pixel es sólido o no +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 (tilemap[tile] != 0) diff --git a/source/room.h b/source/room.h index 4f20c21..d245634 100644 --- a/source/room.h +++ b/source/room.h @@ -81,8 +81,8 @@ public: // Devuelve la cadena del fichero de la habitación contigua segun el borde std::string getRoom(int border); - // Dice si el tile al que pertenece el pixel es sólido o no - bool isSolid(int x, int y); + // Indica si el tile al que pertenece el pixel es sólido o no + bool isFloor(SDL_Point point); }; #endif