From 4243f89dc0a2b9f09c38b2572f41a55348070a3f Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Tue, 5 Jul 2022 20:44:35 +0200 Subject: [PATCH] El jugador ya cambia de pantalla --- media/player/player01.png | Bin 0 -> 222 bytes source/const.h | 9 ++- source/director.cpp | 1 + source/game.cpp | 26 ++++++++- source/game.h | 8 ++- source/movingsprite.cpp | 11 +++- source/movingsprite.h | 15 +++-- source/player.cpp | 118 +++++++++++++++++++++++++++++++++++++- source/player.h | 24 +++++++- source/room.cpp | 41 +++++++------ source/room.h | 12 +--- 11 files changed, 221 insertions(+), 44 deletions(-) create mode 100644 media/player/player01.png diff --git a/media/player/player01.png b/media/player/player01.png new file mode 100644 index 0000000000000000000000000000000000000000..3cd92b8ecb8ba654f99904c35a99e2acbcdfc290 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYe6k~CayA#8@b22Z1oEe@jjv*eM zN2gvCYH(n2{rLa?n&~rU9}Js(ZL-XEon@&^!J($}XU=T$EjXEw795jwKx;Kid~trT z$PqEWV*giBmIt?&Ke%3*9#fXPe`dnc2+1z>oiirqsm@92`h4!EupsCBu+V;;)4LbH z-_ftoboJAkBExBS8O3)0={jxMxWfA4Z0=QixOXY-dS|2Sm!wd=t-oyZn=coSf0wb{ W!NK~_STY0XMg~t;KbLh*2~7Zzqgmbn literal 0 HcmV?d00001 diff --git a/source/const.h b/source/const.h index f567d8d..f496a94 100644 --- a/source/const.h +++ b/source/const.h @@ -29,9 +29,9 @@ const int VIEW_HEIGHT = SCREEN_HEIGHT * 3; // Zona de juego const int PLAY_AREA_TOP = (0 * BLOCK); -const int PLAY_AREA_BOTTOM = GAMECANVAS_HEIGHT - (4 * BLOCK); +const int PLAY_AREA_BOTTOM = (16 * BLOCK); const int PLAY_AREA_LEFT = (0 * BLOCK); -const int PLAY_AREA_RIGHT = GAMECANVAS_WIDTH - (0 * BLOCK); +const int PLAY_AREA_RIGHT = (32 * BLOCK); const int PLAY_AREA_WIDTH = PLAY_AREA_RIGHT - PLAY_AREA_LEFT; const int PLAY_AREA_HEIGHT = PLAY_AREA_BOTTOM - PLAY_AREA_TOP; const int PLAY_AREA_CENTER_X = PLAY_AREA_LEFT + (PLAY_AREA_WIDTH / 2); @@ -41,6 +41,11 @@ const int PLAY_AREA_CENTER_Y = PLAY_AREA_TOP + (PLAY_AREA_HEIGHT / 2); const int PLAY_AREA_FIRST_QUARTER_Y = PLAY_AREA_HEIGHT / 4; const int PLAY_AREA_THIRD_QUARTER_Y = (PLAY_AREA_HEIGHT / 4) * 3; +#define BORDER_TOP 0 +#define BORDER_RIGHT 1 +#define BORDER_BOTTOM 2 +#define BORDER_LEFT 3 + // Anclajes de pantalla const int GAMECANVAS_CENTER_X = GAMECANVAS_WIDTH / 2; const int GAMECANVAS_FIRST_QUARTER_X = GAMECANVAS_WIDTH / 4; diff --git a/source/director.cpp b/source/director.cpp index 8b8357c..412984d 100644 --- a/source/director.cpp +++ b/source/director.cpp @@ -200,6 +200,7 @@ void Director::setFileList() mAsset->add("/data/room/02.room", room); mAsset->add("/media/tilesets/room1.png", bitmap); mAsset->add("/media/enemies/enemy01.png", bitmap); + mAsset->add("/media/player/player01.png", bitmap); } // Carga el fichero de configuración diff --git a/source/game.cpp b/source/game.cpp index d8c307f..38af08b 100644 --- a/source/game.cpp +++ b/source/game.cpp @@ -9,8 +9,10 @@ Game::Game(SDL_Window *window, SDL_Renderer *renderer, Asset *asset, Lang *lang, mLang = lang; mInput = input; + // 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); mEventHandler = new SDL_Event(); mTextureText = new LTexture(); mText = new Text(mAsset->get("smb2.txt"), mTextureText, renderer); @@ -19,11 +21,13 @@ Game::Game(SDL_Window *window, SDL_Renderer *renderer, Asset *asset, Lang *lang, Game::~Game() { + // Borra las referencias a los punteros mRenderer = nullptr; mAsset = nullptr; mLang = nullptr; mInput = nullptr; + // Libera la memoria de los objetos delete mEventHandler; mEventHandler = nullptr; @@ -37,6 +41,9 @@ Game::~Game() delete mRoom; mRoom = nullptr; + delete mRoom; + mRoom = nullptr; + delete mText; mText = nullptr; @@ -108,6 +115,8 @@ void Game::update() checkInput(); mRoom->update(); + mPlayer->update(); + checkPlayerOnBorder(); } } @@ -122,6 +131,7 @@ void Game::draw() mRoom->drawMap(); mRoom->drawEnemies(); + mPlayer->draw(); // Texto en el centro de la pantalla mText->writeCentered(GAMECANVAS_CENTER_X, 18 * 8, mRoom->getName()); @@ -133,8 +143,9 @@ void Game::draw() // Comprueba la entrada void Game::checkInput() { + /* if (mInput->checkInput(INPUT_UP, REPEAT_FALSE)) - changeRoom(mRoom->getRoomUp()); + changeRoom(mRoom->getRoomUp()); if (mInput->checkInput(INPUT_DOWN, REPEAT_FALSE)) changeRoom(mRoom->getRoomDown()); @@ -144,6 +155,7 @@ void Game::checkInput() if (mInput->checkInput(INPUT_RIGHT, REPEAT_FALSE)) changeRoom(mRoom->getRoomRight()); + */ } // Cambia de habitación @@ -165,6 +177,16 @@ bool Game::changeRoom(std::string file) success = true; } - + return success; +} + +// Comprueba si el jugador esta en el borde de la pantalla +void Game::checkPlayerOnBorder() +{ + if (mPlayer->getOnBorder()) + { + changeRoom(mRoom->getRoom(mPlayer->getBorder())); + mPlayer->switchBorders(); + } } \ No newline at end of file diff --git a/source/game.h b/source/game.h index 4e448c6..b130483 100644 --- a/source/game.h +++ b/source/game.h @@ -2,7 +2,6 @@ #include "ifdefs.h" #include "const.h" #include "utils.h" - #include "sprite.h" #include "movingsprite.h" #include "text.h" @@ -14,6 +13,7 @@ #include "screen.h" #include "asset.h" #include "room.h" +#include "player.h" #include "jail_audio.h" #ifndef GAME_H @@ -27,6 +27,7 @@ private: SDL_Event *mEventHandler; // Manejador de eventos Screen *mScreen; // Objeto encargado de manejar el renderizador Room *mRoom; // Objeto encargado de gestionar cada habitación del juego + Player *mPlayer; // Objeto con el jugador Asset *mAsset; // Objeto con la ruta a todos los ficheros de recursos Lang *mLang; // Objeto para gestionar los textos en diferentes idiomas Input *mInput; // Objeto pata gestionar la entrada @@ -49,12 +50,15 @@ private: // Pinta los objetos en pantalla void draw(); - // Comprueba la entrada + // Comprueba la entrada y actua void checkInput(); // Cambia de habitación bool changeRoom(std::string file); + // Comprueba si el jugador esta en el borde de la pantalla y actua + void checkPlayerOnBorder(); + public: // Constructor Game(SDL_Window *window, SDL_Renderer *renderer, Asset *asset, Lang *lang, Input *input); diff --git a/source/movingsprite.cpp b/source/movingsprite.cpp index e11493b..0ad2e1f 100644 --- a/source/movingsprite.cpp +++ b/source/movingsprite.cpp @@ -30,9 +30,12 @@ void MovingSprite::clear() mAngle = 0.0; // Angulo para dibujarlo mRotate = false; // Indica si ha de rotar + mCenter = {0, 0}; // Centro de rotación mRotateSpeed = 0; // Velocidad de giro mRotateAmount = 0.0; // Cantidad de grados a girar en cada iteración mCounter = 0; // Contador interno + + mFlip = SDL_FLIP_NONE; // Establece como se ha de voltear el sprite } // Iniciador @@ -96,7 +99,7 @@ void MovingSprite::move() void MovingSprite::render() { if (mEnabled) - mTexture->render(mRenderer, (int)mPosX, (int)mPosY, &mSpriteClip, mZoomW, mZoomH, mAngle); + mTexture->render(mRenderer, (int)mPosX, (int)mPosY, &mSpriteClip, mZoomW, mZoomH, mAngle, &mCenter, mFlip); } // Obtiene el valor de la variable @@ -283,4 +286,10 @@ void MovingSprite::update() void MovingSprite::switchRotate() { mRotateAmount *= -1; +} + +// Establece el valor de la variable +void MovingSprite::setFlip(SDL_RendererFlip flip) +{ + mFlip = flip; } \ No newline at end of file diff --git a/source/movingsprite.h b/source/movingsprite.h index 5e47874..585b114 100644 --- a/source/movingsprite.h +++ b/source/movingsprite.h @@ -21,11 +21,13 @@ protected: float mZoomW; // Zoom aplicado a la anchura float mZoomH; // Zoom aplicado a la altura - double mAngle; // Angulo para dibujarlo - bool mRotate; // Indica si ha de rotar - Uint16 mRotateSpeed; // Velocidad de giro - double mRotateAmount; // Cantidad de grados a girar en cada iteración - Uint16 mCounter; // Contador interno + double mAngle; // Angulo para dibujarlo + bool mRotate; // Indica si ha de rotar + Uint16 mRotateSpeed; // Velocidad de giro + double mRotateAmount; // Cantidad de grados a girar en cada iteración + Uint16 mCounter; // Contador interno + SDL_Point mCenter; // Centro de rotación + SDL_RendererFlip mFlip; // Indica como se voltea el sprite public: // Constructor @@ -132,6 +134,9 @@ public: // Cambia el sentido de la rotación void switchRotate(); + + // Establece el valor de la variable + void setFlip(SDL_RendererFlip flip); }; #endif diff --git a/source/player.cpp b/source/player.cpp index df7f861..f2e1545 100644 --- a/source/player.cpp +++ b/source/player.cpp @@ -3,11 +3,12 @@ #include // Constructor -Player::Player(std::string _tileset, SDL_Renderer *_renderer, Asset *_asset) +Player::Player(std::string _tileset, SDL_Renderer *_renderer, Asset *_asset, Input *_input) { // Obten punteros a objetos asset = _asset; renderer = _renderer; + input = _input; // Crea objetos texture = new LTexture(); @@ -18,6 +19,25 @@ Player::Player(std::string _tileset, SDL_Renderer *_renderer, Asset *_asset) // Inicializa variables color = stringToColor("white"); + onBorder = false; + border = BORDER_TOP; + + sprite->setPosX(2 * 8); + sprite->setPosY(12 * 8); + sprite->setVelX(0); + sprite->setVelY(0); + sprite->setWidth(8); + sprite->setHeight(16); + sprite->setCurrentFrame(0); + sprite->setAnimationCounter(0); + sprite->setAnimationNumFrames(0, 4); + sprite->setAnimationSpeed(0, 5); + sprite->setAnimationLoop(0, true); + sprite->setAnimationFrames(0, 0, 8 * 0, 0, 8, 16); + sprite->setAnimationFrames(0, 1, 8 * 1, 0, 8, 16); + sprite->setAnimationFrames(0, 2, 8 * 2, 0, 8, 16); + sprite->setAnimationFrames(0, 3, 8 * 3, 0, 8, 16); + sprite->setSpriteClip(sprite->getAnimationClip(0, 0)); } // Destructor @@ -42,6 +62,100 @@ void Player::draw() // Actualiza las variables del objeto void Player::update() { + checkInput(); sprite->update(); - sprite->animate(0); + // sprite->animate(0); + checkBorders(); +} + +// Comprueba las entradas y modifica variables +void Player::checkInput() +{ + // if (mInput->checkInput(INPUT_UP, REPEAT_FALSE)) + // changeRoom(mRoom->getRoomUp()); + // + // if (mInput->checkInput(INPUT_DOWN, REPEAT_FALSE)) + // changeRoom(mRoom->getRoomDown()); + + if (input->checkInput(INPUT_LEFT, REPEAT_TRUE)) + { + sprite->setVelX(-VX); + sprite->animate(0); + sprite->setFlip(SDL_FLIP_HORIZONTAL); + } + + else if (input->checkInput(INPUT_RIGHT, REPEAT_TRUE)) + { + sprite->setVelX(VX); + sprite->animate(0); + sprite->setFlip(SDL_FLIP_NONE); + } + else + { + sprite->setVelX(0); + } +} + +// Indica si el jugador esta en uno de los cuatro bordes de la pantalla +bool Player::getOnBorder() +{ + return onBorder; +} + +// Indica en cual de los cuatro bordes se encuentra +int Player::getBorder() +{ + return border; +} + +// Comprueba si se halla en alguno de los cuatro bordes +void Player::checkBorders() +{ + if (sprite->getPosX() < PLAY_AREA_LEFT) + { + border = BORDER_LEFT; + onBorder = true; + } + else if (sprite->getPosX() > PLAY_AREA_RIGHT - sprite->getWidth()) + { + border = BORDER_RIGHT; + onBorder = true; + } + else if (sprite->getPosY() < PLAY_AREA_TOP) + { + border = BORDER_TOP; + onBorder = true; + } + else if (sprite->getPosY() > PLAY_AREA_BOTTOM - sprite->getHeight()) + { + border = BORDER_BOTTOM; + onBorder = true; + } + else + { + onBorder = false; + } +} + +// Cambia al jugador de un borde al opuesto. Util para el cambio de pantalla +void Player::switchBorders() +{ + if (border == BORDER_TOP) + { + sprite->setPosY(PLAY_AREA_BOTTOM - sprite->getHeight() - 1); + } + else if (border == BORDER_BOTTOM) + { + sprite->setPosY(PLAY_AREA_TOP + 1); + } + else if (border == BORDER_RIGHT) + { + sprite->setPosX(PLAY_AREA_LEFT + 1); + } + if (border == BORDER_LEFT) + { + sprite->setPosX(PLAY_AREA_RIGHT - sprite->getWidth() - 1); + } + + onBorder = false; } \ No newline at end of file diff --git a/source/player.h b/source/player.h index 9ec9349..26dd8ee 100644 --- a/source/player.h +++ b/source/player.h @@ -1,28 +1,41 @@ #pragma once #include "ifdefs.h" +#include "const.h" #include "utils.h" #include "asset.h" #include "animatedsprite.h" +#include "input.h" #include #ifndef PLAYER_H #define PLAYER_H +#define VX 0.6 + // Clase Player class Player { private: LTexture *texture; // Textura con los graficos del enemigo AnimatedSprite *sprite; // Sprite del enemigo + Input *input; // Objeto para gestyionar la entrada SDL_Renderer *renderer; // El renderizador de la ventana Asset *asset; // Objeto con la ruta a todos los ficheros de recursos color_t color; // Color del jugador + 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 + + // Comprueba las entradas y modifica variables + void checkInput(); + + // Comprueba si se halla en alguno de los cuatro bordes + void checkBorders(); public: // Constructor - Player(std::string _tileset, SDL_Renderer *_renderer, Asset *_asset); + Player(std::string _tileset, SDL_Renderer *_renderer, Asset *_asset, Input *_input); // Destructor ~Player(); @@ -32,6 +45,15 @@ public: // Actualiza las variables del objeto void update(); + + // Indica si el jugador esta en uno de los cuatro bordes de la pantalla + bool getOnBorder(); + + // Indica en cual de los cuatro bordes se encuentra + int getBorder(); + + // Cambia al jugador de un borde al opuesto. Util para el cambio de pantalla + void switchBorders(); }; #endif diff --git a/source/room.cpp b/source/room.cpp index f914c9d..34b5509 100644 --- a/source/room.cpp +++ b/source/room.cpp @@ -281,26 +281,29 @@ void Room::update() } } -// Devuelve el valor de la variable -std::string Room::getRoomUp() +// Devuelve la cadena del fichero de la habitación contigua segun el borde +std::string Room::getRoom(int border) { - return room_up; -} + switch (border) + { + case BORDER_TOP: + return room_up; + break; -// Devuelve el valor de la variable -std::string Room::getRoomDown() -{ - return room_down; -} + case BORDER_BOTTOM: + return room_down; + break; -// Devuelve el valor de la variable -std::string Room::getRoomLeft() -{ - return room_left; -} + case BORDER_RIGHT: + return room_right; + break; -// Devuelve el valor de la variable -std::string Room::getRoomRight() -{ - return room_right; -} \ No newline at end of file + case BORDER_LEFT: + return room_left; + break; + + default: + break; + } + return ""; +} diff --git a/source/room.h b/source/room.h index ee75871..e3a1c23 100644 --- a/source/room.h +++ b/source/room.h @@ -78,17 +78,9 @@ public: // Actualiza las variables y objetos de la habitación void update(); - // Devuelve el valor de la variable - std::string getRoomUp(); + // Devuelve la cadena del fichero de la habitación contigua segun el borde + std::string getRoom(int border); - // Devuelve el valor de la variable - std::string getRoomDown(); - - // Devuelve el valor de la variable - std::string getRoomLeft(); - - // Devuelve el valor de la variable - std::string getRoomRight(); }; #endif