From 837306f16e39d0cfa438899793c7f56a0999d455 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20Valor=20Mart=C3=ADnez?= Date: Sat, 21 Aug 2021 20:39:48 +0200 Subject: [PATCH] added power up on the player --- media/gfx/player_head.png | Bin 4253 -> 7214 bytes media/gfx/player_head_powerup.png | Bin 4230 -> 0 bytes source/bullet.cpp | 20 +++-- source/bullet.h | 2 +- source/const.h | 8 ++ source/director.cpp | 1 + source/game.cpp | 26 +++--- source/game.h | 3 +- source/main.cpp | 6 +- source/player.cpp | 145 +++++++++++++++++++++++++++++- source/player.h | 19 +++- 11 files changed, 203 insertions(+), 27 deletions(-) delete mode 100644 media/gfx/player_head_powerup.png diff --git a/media/gfx/player_head.png b/media/gfx/player_head.png index 5a2d9c58965e7a2b9bde428eb8a09683b2e80870..fb22f10f327e38dbeb0ab14c93ab8fe2c10ca46b 100644 GIT binary patch literal 7214 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 literal 4253 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 diff --git a/media/gfx/player_head_powerup.png b/media/gfx/player_head_powerup.png deleted file mode 100644 index 2badebf6964e0750371fd686b5e9b5db32fb0181..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4230 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 * mWidth, 0, mSprite->getWidth(), mSprite->getHeight()); + if (!poweredUp) + mSprite->setSpriteClip(0 * mWidth, 0, mSprite->getWidth(), mSprite->getHeight()); + else + mSprite->setSpriteClip((0 + 3) * mWidth, 0, mSprite->getWidth(), mSprite->getHeight()); break; case BULLET_LEFT: @@ -64,7 +66,10 @@ void Bullet::init(int x, int y, int kind, LTexture *texture, SDL_Renderer *rende mVelX = -2; // Rectangulo con los gráficos del objeto - mSprite->setSpriteClip(1 * mWidth, 0, mSprite->getWidth(), mSprite->getHeight()); + if (!poweredUp) + mSprite->setSpriteClip(1 * mWidth, 0, mSprite->getWidth(), mSprite->getHeight()); + else + mSprite->setSpriteClip((1 + 3) * mWidth, 0, mSprite->getWidth(), mSprite->getHeight()); break; case BULLET_RIGHT: @@ -72,7 +77,10 @@ void Bullet::init(int x, int y, int kind, LTexture *texture, SDL_Renderer *rende mVelX = 2; // Rectangulo con los gráficos del objeto - mSprite->setSpriteClip(2 * mWidth, 0, mSprite->getWidth(), mSprite->getHeight()); + if (!poweredUp) + mSprite->setSpriteClip(2 * mWidth, 0, mSprite->getWidth(), mSprite->getHeight()); + else + mSprite->setSpriteClip((2 + 3) * mWidth, 0, mSprite->getWidth(), mSprite->getHeight()); break; default: @@ -149,7 +157,7 @@ void Bullet::testMove() // Deshabilita el objeto void Bullet::erase() { - init(0, 0, 0, nullptr, nullptr); + init(0, 0, 0, false, nullptr, nullptr); } // Comprueba si el objeto está activo diff --git a/source/bullet.h b/source/bullet.h index add26ce..4f31fb1 100644 --- a/source/bullet.h +++ b/source/bullet.h @@ -16,7 +16,7 @@ public: ~Bullet(); // Iniciador - void init(int x, int y, int kind, LTexture* texture, SDL_Renderer *renderer); + void init(int x, int y, int kind, bool poweredUp, LTexture* texture, SDL_Renderer *renderer); // Pinta el objeto en pantalla void render(); diff --git a/source/const.h b/source/const.h index 3e6e98f..daee450 100644 --- a/source/const.h +++ b/source/const.h @@ -134,8 +134,16 @@ const int SCREEN_THIRD_QUARTER_Y = (SCREEN_HEIGHT / 4) * 3; #define PLAYER_ANIMATION_BODY_WALKING_STOP 4 #define PLAYER_ANIMATION_BODY_FIRING_UP 5 +#define PLAYER_ANIMATION_HEAD_WALKING_LEFT 0 +#define PLAYER_ANIMATION_HEAD_FIRING_LEFT 1 +#define PLAYER_ANIMATION_HEAD_WALKING_RIGHT 2 +#define PLAYER_ANIMATION_HEAD_FIRING_RIGHT 3 +#define PLAYER_ANIMATION_HEAD_WALKING_STOP 4 +#define PLAYER_ANIMATION_HEAD_FIRING_UP 5 + // Variables del jugador #define PLAYER_INVULNERABLE_COUNTER 200 +#define PLAYER_POWERUP_COUNTER 2500 // Secciones del programa #define PROG_SECTION_LOGO 0 diff --git a/source/director.cpp b/source/director.cpp index 8eeb657..1b0a1dd 100644 --- a/source/director.cpp +++ b/source/director.cpp @@ -214,6 +214,7 @@ void Director::setFileList() mFileList[38] = mExecutablePath + "/" + "../media/gfx/player_death.png"; mFileList[39] = mExecutablePath + "/" + "../media/gfx/player_legs.png"; mFileList[40] = mExecutablePath + "/" + "../media/gfx/title.png"; + mFileList[41] = mExecutablePath + "/" + "../media/gfx/player_head.png"; } // Comprueba que todos los ficheros existen diff --git a/source/game.cpp b/source/game.cpp index dabbd01..376292c 100644 --- a/source/game.cpp +++ b/source/game.cpp @@ -31,6 +31,7 @@ Game::Game(SDL_Renderer *renderer, std::string *filelist, std::string *textStrin mTextureGameBG = new LTexture(); mTextureGameText = new LTexture(); mTextureItems = new LTexture(); + mTexturePlayerHead = new LTexture(); mTexturePlayerBody = new LTexture(); mTexturePlayerDeath = new LTexture(); mTexturePlayerLegs = new LTexture(); @@ -123,6 +124,10 @@ Game::~Game() delete mTextureItems; mTextureItems = nullptr; + mTexturePlayerHead->unload(); + delete mTexturePlayerHead; + mTexturePlayerHead = nullptr; + mTexturePlayerBody->unload(); delete mTexturePlayerBody; mTexturePlayerBody = nullptr; @@ -352,7 +357,7 @@ void Game::init() mSpritePowerMeter->setSpriteClip(256, 192 - 8, 40, 8); // Objeto jugador - mPlayer->init(PLAY_AREA_CENTER_X - 11, PLAY_AREA_BOTTOM - 24, mTexturePlayerLegs, mTexturePlayerBody, mRenderer); + mPlayer->init(PLAY_AREA_CENTER_X - 11, PLAY_AREA_BOTTOM - 24, mTexturePlayerLegs, mTexturePlayerBody, mTexturePlayerHead, mRenderer); // Establece a cero todos los valores del vector de objetos globo resetBalloons(); @@ -439,6 +444,7 @@ bool Game::loadMedia() success &= loadTextureFromFile(mTextureText, mFileList[30], mRenderer); success &= loadTextureFromFile(mTextureText2, mFileList[29], mRenderer); success &= loadTextureFromFile(mTexturePlayerLegs, mFileList[39], mRenderer); + success &= loadTextureFromFile(mTexturePlayerHead, mFileList[41], mRenderer); success &= loadTextureFromFile(mTexturePlayerBody, mFileList[37], mRenderer); success &= loadTextureFromFile(mTexturePlayerDeath, mFileList[38], mRenderer); success &= loadTextureFromFile(mTextureBalloon, mFileList[24], mRenderer); @@ -2085,9 +2091,9 @@ void Game::resetBullets() } // Crea un objeto bala -void Game::createBullet(int x, int y, Uint8 kind) +void Game::createBullet(int x, int y, Uint8 kind, bool poweredUp) { - mBullet[getBulletFreeIndex()]->init(x, y, kind, mTextureBullet, mRenderer); + mBullet[getBulletFreeIndex()]->init(x, y, kind, poweredUp, mTextureBullet, mRenderer); } // Actualiza los items @@ -2582,7 +2588,7 @@ void Game::checkGameInput() if (mPlayer->canFire()) { mPlayer->setInput(INPUT_FIRE_UP); - createBullet(mPlayer->getPosX() + (mPlayer->getWidth() / 2) - 4, mPlayer->getPosY() + (mPlayer->getHeight() / 2), BULLET_UP); + createBullet(mPlayer->getPosX() + (mPlayer->getWidth() / 2) - 4, mPlayer->getPosY() + (mPlayer->getHeight() / 2), BULLET_UP, mPlayer->isPowerUp()); mPlayer->setFireCooldown(10); } @@ -2590,7 +2596,7 @@ void Game::checkGameInput() if (mPlayer->canFire()) { mPlayer->setInput(INPUT_FIRE_LEFT); - createBullet(mPlayer->getPosX() + (mPlayer->getWidth() / 2) - 4, mPlayer->getPosY() + (mPlayer->getHeight() / 2), BULLET_UP); + createBullet(mPlayer->getPosX() + (mPlayer->getWidth() / 2) - 4, mPlayer->getPosY() + (mPlayer->getHeight() / 2), BULLET_UP, mPlayer->isPowerUp()); mPlayer->setFireCooldown(10); } @@ -2598,7 +2604,7 @@ void Game::checkGameInput() if (mPlayer->canFire()) { mPlayer->setInput(INPUT_FIRE_RIGHT); - createBullet(mPlayer->getPosX() + (mPlayer->getWidth() / 2) - 4, mPlayer->getPosY() + (mPlayer->getHeight() / 2), BULLET_UP); + createBullet(mPlayer->getPosX() + (mPlayer->getWidth() / 2) - 4, mPlayer->getPosY() + (mPlayer->getHeight() / 2), BULLET_UP, mPlayer->isPowerUp()); mPlayer->setFireCooldown(10); } @@ -2642,7 +2648,7 @@ void Game::checkGameInput() if (mPlayer->canFire()) { mPlayer->setInput(INPUT_FIRE_UP); - createBullet(mPlayer->getPosX() + (mPlayer->getWidth() / 2) - 4, mPlayer->getPosY() + (mPlayer->getHeight() / 2), BULLET_UP); + createBullet(mPlayer->getPosX() + (mPlayer->getWidth() / 2) - 4, mPlayer->getPosY() + (mPlayer->getHeight() / 2), BULLET_UP, mPlayer->isPowerUp()); mPlayer->setFireCooldown(10); // Reproduce el sonido de disparo @@ -2652,13 +2658,13 @@ void Game::checkGameInput() } } - // Comprueba el input de desiparar a la izquierda + // Comprueba el input de disparar a la izquierda if (mInput->checkInput(INPUT_BUTTON_1, REPEAT_TRUE)) { if (mPlayer->canFire()) { mPlayer->setInput(INPUT_FIRE_LEFT); - createBullet(mPlayer->getPosX() + (mPlayer->getWidth() / 2) - 4, mPlayer->getPosY() + (mPlayer->getHeight() / 2), BULLET_LEFT); + createBullet(mPlayer->getPosX() + (mPlayer->getWidth() / 2) - 4, mPlayer->getPosY() + (mPlayer->getHeight() / 2), BULLET_LEFT, mPlayer->isPowerUp()); mPlayer->setFireCooldown(10); // Reproduce el sonido de disparo @@ -2674,7 +2680,7 @@ void Game::checkGameInput() if (mPlayer->canFire()) { mPlayer->setInput(INPUT_FIRE_RIGHT); - createBullet(mPlayer->getPosX() + (mPlayer->getWidth() / 2) - 4, mPlayer->getPosY() + (mPlayer->getHeight() / 2), BULLET_RIGHT); + createBullet(mPlayer->getPosX() + (mPlayer->getWidth() / 2) - 4, mPlayer->getPosY() + (mPlayer->getHeight() / 2), BULLET_RIGHT, mPlayer->isPowerUp()); mPlayer->setFireCooldown(10); // Reproduce el sonido de disparo diff --git a/source/game.h b/source/game.h index eb2da84..ce4f808 100644 --- a/source/game.h +++ b/source/game.h @@ -82,6 +82,7 @@ private: LTexture *mTextureGameBG; // Textura para el fondo del juego LTexture *mTextureGameText; // Textura para los sprites con textos LTexture *mTextureItems; // Textura para los items + LTexture *mTexturePlayerHead; // Textura para la cabeza del jugador LTexture *mTexturePlayerBody; // Textura para el cuerpo del jugador LTexture *mTexturePlayerDeath; // Textura para la animación de muerte del jugador LTexture *mTexturePlayerLegs; // Textura para las piernas del jugador @@ -325,7 +326,7 @@ public: void resetBullets(); // Crea un objeto bala - void createBullet(int x, int y, Uint8 kind); + void createBullet(int x, int y, Uint8 kind, bool poweredUp); // Actualiza los items void updateItems(); diff --git a/source/main.cpp b/source/main.cpp index 52c0ba4..e1b72d3 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -1,9 +1,7 @@ /* -This source code copyrighted by JailDesigner (2020) -started on Castalla 15-07-2020. -*/ +Código fuente creado por JailDesigner (2020) +Empezado en Castalla el 15/07/2020. -/* Descripción del enfoque utilizado para crear el juego. El programa contine una serie de clases/objetos básicos: la clase sprite diff --git a/source/player.cpp b/source/player.cpp index db115fb..85da73c 100644 --- a/source/player.cpp +++ b/source/player.cpp @@ -14,16 +14,16 @@ Player::~Player() { delete mSpriteLegs; mSpriteLegs = nullptr; - + delete mSpriteBody; mSpriteBody = nullptr; - + delete mSpriteHead; mSpriteHead = nullptr; } // Iniciador -void Player::init(float x, int y, LTexture *textureLegs, LTexture *textureBody, SDL_Renderer *renderer) +void Player::init(float x, int y, LTexture *textureLegs, LTexture *textureBody, LTexture *textureHead, SDL_Renderer *renderer) { // Inicializa variables de estado mAlive = true; @@ -31,6 +31,8 @@ void Player::init(float x, int y, LTexture *textureLegs, LTexture *textureBody, mStatusFiring = PLAYER_STATUS_FIRING_NO; mInvulnerable = false; mInvulnerableCounter = PLAYER_INVULNERABLE_COUNTER; + mPowerUp = true; + mPowerUpCounter = PLAYER_POWERUP_COUNTER; mExtraHit = false; mCoffees = 0; mInput = true; @@ -68,6 +70,7 @@ void Player::init(float x, int y, LTexture *textureLegs, LTexture *textureBody, // Inicia el sprite mSpriteLegs->init(textureLegs, renderer); mSpriteBody->init(textureBody, renderer); + mSpriteHead->init(textureHead, renderer); // Establece el alto y ancho del sprite mSpriteLegs->setWidth(mWidth); @@ -76,6 +79,9 @@ void Player::init(float x, int y, LTexture *textureLegs, LTexture *textureBody, mSpriteBody->setWidth(mWidth); mSpriteBody->setHeight(mHeight); + mSpriteHead->setWidth(mWidth); + mSpriteHead->setHeight(mHeight); + // Establece la posición del sprite mSpriteLegs->setPosX(int(mPosX)); mSpriteLegs->setPosY(mPosY); @@ -83,6 +89,9 @@ void Player::init(float x, int y, LTexture *textureLegs, LTexture *textureBody, mSpriteBody->setPosX(int(mPosX)); mSpriteBody->setPosY(mPosY); + mSpriteHead->setPosX(int(mPosX)); + mSpriteHead->setPosY(mPosY); + // Inicializa las variables para la animación mSpriteLegs->setCurrentFrame(0); mSpriteLegs->setAnimationCounter(0); @@ -90,6 +99,9 @@ void Player::init(float x, int y, LTexture *textureLegs, LTexture *textureBody, mSpriteBody->setCurrentFrame(0); mSpriteBody->setAnimationCounter(0); + mSpriteHead->setCurrentFrame(0); + mSpriteHead->setAnimationCounter(0); + // Establece el numero de frames de cada animacion mSpriteLegs->setAnimationNumFrames(PLAYER_ANIMATION_LEGS_WALKING_STOP, 4); mSpriteLegs->setAnimationNumFrames(PLAYER_ANIMATION_LEGS_WALKING_LEFT, 4); @@ -102,6 +114,13 @@ void Player::init(float x, int y, LTexture *textureLegs, LTexture *textureBody, mSpriteBody->setAnimationNumFrames(PLAYER_ANIMATION_BODY_WALKING_STOP, 4); mSpriteBody->setAnimationNumFrames(PLAYER_ANIMATION_BODY_FIRING_UP, 4); + mSpriteHead->setAnimationNumFrames(PLAYER_ANIMATION_HEAD_WALKING_LEFT, 4); + mSpriteHead->setAnimationNumFrames(PLAYER_ANIMATION_HEAD_FIRING_LEFT, 4); + mSpriteHead->setAnimationNumFrames(PLAYER_ANIMATION_HEAD_WALKING_RIGHT, 4); + mSpriteHead->setAnimationNumFrames(PLAYER_ANIMATION_HEAD_FIRING_RIGHT, 4); + mSpriteHead->setAnimationNumFrames(PLAYER_ANIMATION_HEAD_WALKING_STOP, 4); + mSpriteHead->setAnimationNumFrames(PLAYER_ANIMATION_HEAD_FIRING_UP, 4); + // Establece la velocidad de cada animación mSpriteLegs->setAnimationSpeed(PLAYER_ANIMATION_LEGS_WALKING_STOP, 10); mSpriteLegs->setAnimationSpeed(PLAYER_ANIMATION_LEGS_WALKING_LEFT, 5); @@ -114,6 +133,13 @@ void Player::init(float x, int y, LTexture *textureLegs, LTexture *textureBody, mSpriteBody->setAnimationSpeed(PLAYER_ANIMATION_BODY_WALKING_STOP, 10); mSpriteBody->setAnimationSpeed(PLAYER_ANIMATION_BODY_FIRING_UP, 5); + mSpriteHead->setAnimationSpeed(PLAYER_ANIMATION_HEAD_WALKING_LEFT, 5); + mSpriteHead->setAnimationSpeed(PLAYER_ANIMATION_HEAD_FIRING_LEFT, 5); + mSpriteHead->setAnimationSpeed(PLAYER_ANIMATION_HEAD_WALKING_RIGHT, 5); + mSpriteHead->setAnimationSpeed(PLAYER_ANIMATION_HEAD_FIRING_RIGHT, 5); + mSpriteHead->setAnimationSpeed(PLAYER_ANIMATION_HEAD_WALKING_STOP, 10); + mSpriteHead->setAnimationSpeed(PLAYER_ANIMATION_HEAD_FIRING_UP, 5); + // Establece si la animación se reproduce en bucle mSpriteLegs->setAnimationLoop(PLAYER_ANIMATION_LEGS_WALKING_STOP, true); mSpriteLegs->setAnimationLoop(PLAYER_ANIMATION_LEGS_WALKING_LEFT, true); @@ -126,6 +152,13 @@ void Player::init(float x, int y, LTexture *textureLegs, LTexture *textureBody, mSpriteBody->setAnimationLoop(PLAYER_ANIMATION_BODY_WALKING_STOP, true); mSpriteBody->setAnimationLoop(PLAYER_ANIMATION_BODY_FIRING_UP, true); + mSpriteHead->setAnimationLoop(PLAYER_ANIMATION_HEAD_WALKING_LEFT, true); + mSpriteHead->setAnimationLoop(PLAYER_ANIMATION_HEAD_FIRING_LEFT, true); + mSpriteHead->setAnimationLoop(PLAYER_ANIMATION_HEAD_WALKING_RIGHT, true); + mSpriteHead->setAnimationLoop(PLAYER_ANIMATION_HEAD_FIRING_RIGHT, true); + mSpriteHead->setAnimationLoop(PLAYER_ANIMATION_HEAD_WALKING_STOP, true); + mSpriteHead->setAnimationLoop(PLAYER_ANIMATION_HEAD_FIRING_UP, true); + // Establece los frames de cada animación mSpriteLegs->setAnimationFrames(PLAYER_ANIMATION_LEGS_WALKING_LEFT, 0, mWidth * 0, mHeight * 0, mWidth, mHeight); mSpriteLegs->setAnimationFrames(PLAYER_ANIMATION_LEGS_WALKING_LEFT, 1, mWidth * 1, mHeight * 0, mWidth, mHeight); @@ -172,9 +205,40 @@ void Player::init(float x, int y, LTexture *textureLegs, LTexture *textureBody, mSpriteBody->setAnimationFrames(PLAYER_ANIMATION_BODY_FIRING_UP, 2, mWidth * 2, mHeight * 5, mWidth, mHeight); mSpriteBody->setAnimationFrames(PLAYER_ANIMATION_BODY_FIRING_UP, 3, mWidth * 3, mHeight * 5, mWidth, mHeight); + mSpriteHead->setAnimationFrames(PLAYER_ANIMATION_HEAD_WALKING_LEFT, 0, mWidth * 0, mHeight * 0, mWidth, mHeight); + mSpriteHead->setAnimationFrames(PLAYER_ANIMATION_HEAD_WALKING_LEFT, 1, mWidth * 1, mHeight * 0, mWidth, mHeight); + mSpriteHead->setAnimationFrames(PLAYER_ANIMATION_HEAD_WALKING_LEFT, 2, mWidth * 2, mHeight * 0, mWidth, mHeight); + mSpriteHead->setAnimationFrames(PLAYER_ANIMATION_HEAD_WALKING_LEFT, 3, mWidth * 3, mHeight * 0, mWidth, mHeight); + + mSpriteHead->setAnimationFrames(PLAYER_ANIMATION_HEAD_FIRING_LEFT, 0, mWidth * 0, mHeight * 1, mWidth, mHeight); + mSpriteHead->setAnimationFrames(PLAYER_ANIMATION_HEAD_FIRING_LEFT, 1, mWidth * 1, mHeight * 1, mWidth, mHeight); + mSpriteHead->setAnimationFrames(PLAYER_ANIMATION_HEAD_FIRING_LEFT, 2, mWidth * 2, mHeight * 1, mWidth, mHeight); + mSpriteHead->setAnimationFrames(PLAYER_ANIMATION_HEAD_FIRING_LEFT, 3, mWidth * 3, mHeight * 1, mWidth, mHeight); + + mSpriteHead->setAnimationFrames(PLAYER_ANIMATION_HEAD_WALKING_RIGHT, 0, mWidth * 0, mHeight * 2, mWidth, mHeight); + mSpriteHead->setAnimationFrames(PLAYER_ANIMATION_HEAD_WALKING_RIGHT, 1, mWidth * 1, mHeight * 2, mWidth, mHeight); + mSpriteHead->setAnimationFrames(PLAYER_ANIMATION_HEAD_WALKING_RIGHT, 2, mWidth * 2, mHeight * 2, mWidth, mHeight); + mSpriteHead->setAnimationFrames(PLAYER_ANIMATION_HEAD_WALKING_RIGHT, 3, mWidth * 3, mHeight * 2, mWidth, mHeight); + + mSpriteHead->setAnimationFrames(PLAYER_ANIMATION_HEAD_FIRING_RIGHT, 0, mWidth * 0, mHeight * 3, mWidth, mHeight); + mSpriteHead->setAnimationFrames(PLAYER_ANIMATION_HEAD_FIRING_RIGHT, 1, mWidth * 1, mHeight * 3, mWidth, mHeight); + mSpriteHead->setAnimationFrames(PLAYER_ANIMATION_HEAD_FIRING_RIGHT, 2, mWidth * 2, mHeight * 3, mWidth, mHeight); + mSpriteHead->setAnimationFrames(PLAYER_ANIMATION_HEAD_FIRING_RIGHT, 3, mWidth * 3, mHeight * 3, mWidth, mHeight); + + mSpriteHead->setAnimationFrames(PLAYER_ANIMATION_HEAD_WALKING_STOP, 0, mWidth * 0, mHeight * 4, mWidth, mHeight); + mSpriteHead->setAnimationFrames(PLAYER_ANIMATION_HEAD_WALKING_STOP, 1, mWidth * 1, mHeight * 4, mWidth, mHeight); + mSpriteHead->setAnimationFrames(PLAYER_ANIMATION_HEAD_WALKING_STOP, 2, mWidth * 2, mHeight * 4, mWidth, mHeight); + mSpriteHead->setAnimationFrames(PLAYER_ANIMATION_HEAD_WALKING_STOP, 3, mWidth * 3, mHeight * 4, mWidth, mHeight); + + mSpriteHead->setAnimationFrames(PLAYER_ANIMATION_HEAD_FIRING_UP, 0, mWidth * 0, mHeight * 5, mWidth, mHeight); + mSpriteHead->setAnimationFrames(PLAYER_ANIMATION_HEAD_FIRING_UP, 1, mWidth * 1, mHeight * 5, mWidth, mHeight); + mSpriteHead->setAnimationFrames(PLAYER_ANIMATION_HEAD_FIRING_UP, 2, mWidth * 2, mHeight * 5, mWidth, mHeight); + mSpriteHead->setAnimationFrames(PLAYER_ANIMATION_HEAD_FIRING_UP, 3, mWidth * 3, mHeight * 5, mWidth, mHeight); + // Selecciona un frame para pintar mSpriteLegs->setSpriteClip(mSpriteLegs->getAnimationClip(PLAYER_ANIMATION_LEGS_WALKING_STOP, 0)); mSpriteBody->setSpriteClip(mSpriteBody->getAnimationClip(PLAYER_ANIMATION_BODY_WALKING_STOP, 0)); + mSpriteHead->setSpriteClip(mSpriteHead->getAnimationClip(PLAYER_ANIMATION_HEAD_WALKING_STOP, 0)); } // Actua en consecuencia de la entrada recibida @@ -232,6 +296,9 @@ void Player::move() mSpriteBody->setPosX(getPosX()); mSpriteBody->setPosY(mPosY); + + mSpriteHead->setPosX(getPosX()); + mSpriteHead->setPosY(mPosY); } } @@ -246,12 +313,14 @@ void Player::render() { mSpriteLegs->render(); mSpriteBody->render(); + mSpriteHead->render(); } } else { mSpriteLegs->render(); mSpriteBody->render(); + mSpriteHead->render(); } } } @@ -275,6 +344,7 @@ void Player::setFiringStatus(Uint8 status) { mStatusFiring = status; mSpriteBody->setCurrentFrame(0); + mSpriteHead->setCurrentFrame(0); } } @@ -292,6 +362,17 @@ void Player::setAnimation() mSpriteBody->setAnimationFrames(PLAYER_ANIMATION_BODY_FIRING_UP, i, mWidth * i, mHeight * (5 + (6 * mCoffees)), mWidth, mHeight); } + // Actualiza los frames de la animación en función de si se tiene el PowerUp + for (int i = 0; i < 4; i++) + { + mSpriteHead->setAnimationFrames(PLAYER_ANIMATION_HEAD_WALKING_LEFT, i, (mWidth * i) + (mPowerUp * 96), mHeight * (0 + (6 * mCoffees)), mWidth, mHeight); + mSpriteHead->setAnimationFrames(PLAYER_ANIMATION_HEAD_FIRING_LEFT, i, (mWidth * i) + (mPowerUp * 96), mHeight * (1 + (6 * mCoffees)), mWidth, mHeight); + mSpriteHead->setAnimationFrames(PLAYER_ANIMATION_HEAD_WALKING_RIGHT, i, (mWidth * i) + (mPowerUp * 96), mHeight * (2 + (6 * mCoffees)), mWidth, mHeight); + mSpriteHead->setAnimationFrames(PLAYER_ANIMATION_HEAD_FIRING_RIGHT, i, (mWidth * i) + (mPowerUp * 96), mHeight * (3 + (6 * mCoffees)), mWidth, mHeight); + mSpriteHead->setAnimationFrames(PLAYER_ANIMATION_HEAD_WALKING_STOP, i, (mWidth * i) + (mPowerUp * 96), mHeight * (4 + (6 * mCoffees)), mWidth, mHeight); + mSpriteHead->setAnimationFrames(PLAYER_ANIMATION_HEAD_FIRING_UP, i, (mWidth * i) + (mPowerUp * 96), mHeight * (5 + (6 * mCoffees)), mWidth, mHeight); + } + switch (mStatusWalking) { case PLAYER_STATUS_WALKING_LEFT: @@ -300,22 +381,27 @@ void Player::setAnimation() { case PLAYER_STATUS_FIRING_UP: mSpriteBody->animate(PLAYER_ANIMATION_BODY_FIRING_UP); + mSpriteHead->animate(PLAYER_ANIMATION_HEAD_FIRING_UP); break; case PLAYER_STATUS_FIRING_LEFT: mSpriteBody->animate(PLAYER_ANIMATION_BODY_FIRING_LEFT); + mSpriteHead->animate(PLAYER_ANIMATION_HEAD_FIRING_LEFT); break; case PLAYER_STATUS_FIRING_RIGHT: mSpriteBody->animate(PLAYER_ANIMATION_BODY_FIRING_RIGHT); + mSpriteHead->animate(PLAYER_ANIMATION_HEAD_FIRING_RIGHT); break; case PLAYER_STATUS_FIRING_NO: mSpriteBody->animate(PLAYER_ANIMATION_BODY_WALKING_LEFT); + mSpriteHead->animate(PLAYER_ANIMATION_HEAD_WALKING_LEFT); break; default: mSpriteBody->animate(PLAYER_ANIMATION_BODY_WALKING_STOP); + mSpriteHead->animate(PLAYER_ANIMATION_HEAD_WALKING_STOP); break; } break; @@ -326,22 +412,27 @@ void Player::setAnimation() { case PLAYER_STATUS_FIRING_UP: mSpriteBody->animate(PLAYER_ANIMATION_BODY_FIRING_UP); + mSpriteHead->animate(PLAYER_ANIMATION_HEAD_FIRING_UP); break; case PLAYER_STATUS_FIRING_LEFT: mSpriteBody->animate(PLAYER_ANIMATION_BODY_FIRING_LEFT); + mSpriteHead->animate(PLAYER_ANIMATION_HEAD_FIRING_LEFT); break; case PLAYER_STATUS_FIRING_RIGHT: mSpriteBody->animate(PLAYER_ANIMATION_BODY_FIRING_RIGHT); + mSpriteHead->animate(PLAYER_ANIMATION_HEAD_FIRING_RIGHT); break; case PLAYER_STATUS_FIRING_NO: mSpriteBody->animate(PLAYER_ANIMATION_BODY_WALKING_RIGHT); + mSpriteHead->animate(PLAYER_ANIMATION_HEAD_WALKING_RIGHT); break; default: mSpriteBody->animate(PLAYER_ANIMATION_BODY_WALKING_STOP); + mSpriteHead->animate(PLAYER_ANIMATION_HEAD_WALKING_STOP); break; } break; @@ -352,22 +443,27 @@ void Player::setAnimation() { case PLAYER_STATUS_FIRING_UP: mSpriteBody->animate(PLAYER_ANIMATION_BODY_FIRING_UP); + mSpriteHead->animate(PLAYER_ANIMATION_HEAD_FIRING_UP); break; case PLAYER_STATUS_FIRING_LEFT: mSpriteBody->animate(PLAYER_ANIMATION_BODY_FIRING_LEFT); + mSpriteHead->animate(PLAYER_ANIMATION_HEAD_FIRING_LEFT); break; case PLAYER_STATUS_FIRING_RIGHT: mSpriteBody->animate(PLAYER_ANIMATION_BODY_FIRING_RIGHT); + mSpriteHead->animate(PLAYER_ANIMATION_HEAD_FIRING_RIGHT); break; case PLAYER_STATUS_FIRING_NO: mSpriteBody->animate(PLAYER_ANIMATION_BODY_WALKING_STOP); + mSpriteHead->animate(PLAYER_ANIMATION_HEAD_WALKING_STOP); break; default: mSpriteBody->animate(PLAYER_ANIMATION_BODY_WALKING_STOP); + mSpriteHead->animate(PLAYER_ANIMATION_HEAD_WALKING_STOP); break; } break; @@ -427,7 +523,9 @@ void Player::updateCooldown() { if (mCooldown > 0) { - --mCooldown; + mCooldown--; + if (mPowerUp) + mCooldown--; } else { @@ -442,6 +540,7 @@ void Player::update() setAnimation(); shiftColliders(); updateCooldown(); + updatePowerUpCounter(); updateInvulnerableCounter(); } @@ -543,6 +642,44 @@ void Player::updateInvulnerableCounter() } } +// Obtiene el valor de la variable +bool Player::isPowerUp() +{ + return mPowerUp; +} + +// Establece el valor de la variable +void Player::setPowerUp(bool value) +{ + mPowerUp = value; +} + +// Obtiene el valor de la variable +Uint16 Player::getPowerUpCounter() +{ + return mPowerUpCounter; +} + +// Establece el valor de la variable +void Player::setPowerUpCounter(Uint16 value) +{ + mPowerUpCounter = value; +} + +// Actualiza el valor de la variable +void Player::updatePowerUpCounter() +{ + if (mPowerUpCounter > 0) + { + --mPowerUpCounter; + } + else + { + mPowerUp = false; + mPowerUpCounter = PLAYER_POWERUP_COUNTER; + } +} + // Obtiene el valor de la variable bool Player::hasExtraHit() { diff --git a/source/player.h b/source/player.h index c35c7ad..e64cf35 100644 --- a/source/player.h +++ b/source/player.h @@ -33,6 +33,8 @@ private: Uint16 mInvulnerableCounter; // Temporizador para la invulnerabilidad bool mExtraHit; // Indica si el jugador tiene un toque extra Uint8 mCoffees; // Indica cuantos cafes lleva acumulados + bool mPowerUp; // Indica si el jugador tiene activo el modo PowerUp + Uint16 mPowerUpCounter; // Temporizador para el modo PowerUp bool mInput; // Indica si puede recibir ordenes de entrada AnimatedSprite *mSpriteLegs; // Sprite para dibujar las piernas @@ -50,7 +52,7 @@ public: ~Player(); // Iniciador - void init(float x, int y, LTexture *textureLegs, LTexture *textureBody, SDL_Renderer *renderer); + void init(float x, int y, LTexture *textureLegs, LTexture *textureBody, LTexture *textureHead, SDL_Renderer *renderer); // Actua en consecuencia de la entrada recibida void setInput(Uint8 input); @@ -134,6 +136,21 @@ public: // Actualiza el valor de la variable void updateInvulnerableCounter(); + // Obtiene el valor de la variable + bool isPowerUp(); + + // Establece el valor de la variable + void setPowerUp(bool value); + + // Obtiene el valor de la variable + Uint16 getPowerUpCounter(); + + // Establece el valor de la variable + void setPowerUpCounter(Uint16 value); + + // Actualiza el valor de la variable + void updatePowerUpCounter(); + // Obtiene el valor de la variable bool hasExtraHit();