From 36bb6b8fe8f853ed5f87be87aaf8b3ad6924eb31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20Valor=20Mart=C3=ADnez?= Date: Mon, 5 Apr 2021 17:56:15 +0200 Subject: [PATCH] working on "How to play" --- media/.DS_Store | Bin 10244 -> 10244 bytes media/sound/credits.txt | 8 +- media/sound/powerball.wav | Bin 0 -> 338732 bytes source/animatedsprite.cpp | 35 ++- source/balloon.cpp | 141 +++++++---- source/balloon.h | 8 + source/const.h | 29 ++- source/gamedirector.cpp | 501 +++++++++++++++++++++++--------------- source/gamedirector.h | 17 +- source/menu.h | 6 +- source/movingsprite.cpp | 108 +++++++- source/movingsprite.h | 35 ++- source/smartsprite.cpp | 49 +--- source/smartsprite.h | 22 -- source/sprite.cpp | 18 +- source/sprite.h | 63 +++-- 16 files changed, 648 insertions(+), 392 deletions(-) create mode 100644 media/sound/powerball.wav diff --git a/media/.DS_Store b/media/.DS_Store index 5c8baf3d18ae0eafa1db6b8dca4c669c215197bc..3e05191957fe1d5e5254b36483f427576cbe9b22 100644 GIT binary patch delta 894 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�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 o7 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 mAnimation[index].numFrames) + if (mEnabled) { - if (mAnimation[index].loop) + // Calculamos el frame actual a partir del contador + mCurrentFrame = mAnimationCounter / mAnimation[index].speed; + + // Si alcanzamos el final de la animación, reiniciamos el contador de la animación + // en función de la variable loop + if (mCurrentFrame >= mAnimation[index].numFrames) { - mAnimationCounter = 0; + if (mAnimation[index].loop) + mAnimationCounter = 0; + else + mCurrentFrame = mAnimation[index].numFrames; } + // En caso contrario else { - mCurrentFrame = mAnimation[index].numFrames; - } - } - // En caso contrario - else - { - // Escogemos el frame correspondiente de la animación - setSpriteClip(mAnimation[index].frames[mCurrentFrame]); + // Escogemos el frame correspondiente de la animación + setSpriteClip(mAnimation[index].frames[mCurrentFrame]); - // Incrementamos el contador de la animacion - ++mAnimationCounter; + // Incrementamos el contador de la animacion + mAnimationCounter++; + } } } diff --git a/source/balloon.cpp b/source/balloon.cpp index e6c84e7..9b79f67 100644 --- a/source/balloon.cpp +++ b/source/balloon.cpp @@ -34,8 +34,10 @@ void Balloon::init(float x, float y, Uint8 kind, float velx, float speed, Uint16 mEnabled = true; // Alto y ancho del objeto - mWidth = BALLOON_SIZE_1; - mHeight = BALLOON_SIZE_1; + mWidth = BALLOON_WIDTH_1; + mHeight = BALLOON_WIDTH_1; + mSize = BALLOON_SIZE_1; + mPower = 1; // Inicializa los valores de velocidad y gravedad mVelX = velx; @@ -45,7 +47,7 @@ void Balloon::init(float x, float y, Uint8 kind, float velx, float speed, Uint16 mDefaultVelY = 2.6f; // Puntos que da el globo al ser destruido - mScore = 50; + mScore = BALLOON_SCORE_1; // Amenaza que genera el globo mMenace = 1; @@ -66,8 +68,10 @@ void Balloon::init(float x, float y, Uint8 kind, float velx, float speed, Uint16 mEnabled = true; // Alto y ancho del objeto - mWidth = BALLOON_SIZE_2; - mHeight = BALLOON_SIZE_2; + mWidth = BALLOON_WIDTH_2; + mHeight = BALLOON_WIDTH_2; + mSize = BALLOON_SIZE_2; + mPower = 3; // Inicializa los valores de velocidad y gravedad mVelX = velx; @@ -77,7 +81,7 @@ void Balloon::init(float x, float y, Uint8 kind, float velx, float speed, Uint16 mDefaultVelY = 3.5f; // Puntos que da el globo al ser destruido - mScore = 100; + mScore = BALLOON_SCORE_2; // Amenaza que genera el globo mMenace = 2; @@ -98,8 +102,10 @@ void Balloon::init(float x, float y, Uint8 kind, float velx, float speed, Uint16 mEnabled = true; // Alto y ancho del objeto - mWidth = BALLOON_SIZE_3; - mHeight = BALLOON_SIZE_3; + mWidth = BALLOON_WIDTH_3; + mHeight = BALLOON_WIDTH_3; + mSize = BALLOON_SIZE_3; + mPower = 7; // Inicializa los valores de velocidad y gravedad mVelX = velx; @@ -109,7 +115,7 @@ void Balloon::init(float x, float y, Uint8 kind, float velx, float speed, Uint16 mDefaultVelY = 4.50f; // Puntos que da el globo al ser destruido - mScore = 200; + mScore = BALLOON_SCORE_3; // Amenaza que genera el globo mMenace = 4; @@ -130,8 +136,10 @@ void Balloon::init(float x, float y, Uint8 kind, float velx, float speed, Uint16 mEnabled = true; // Alto y ancho del objeto - mWidth = BALLOON_SIZE_4; - mHeight = BALLOON_SIZE_4; + mWidth = BALLOON_WIDTH_4; + mHeight = BALLOON_WIDTH_4; + mSize = BALLOON_SIZE_4; + mPower = 15; // Inicializa los valores de velocidad y gravedad mVelX = velx; @@ -141,7 +149,7 @@ void Balloon::init(float x, float y, Uint8 kind, float velx, float speed, Uint16 mDefaultVelY = 4.95f; // Puntos que da el globo al ser destruido - mScore = 400; + mScore = BALLOON_SCORE_4; // Amenaza que genera el globo mMenace = 8; @@ -162,8 +170,10 @@ void Balloon::init(float x, float y, Uint8 kind, float velx, float speed, Uint16 mEnabled = true; // Alto y ancho del objeto - mWidth = BALLOON_SIZE_1; - mHeight = BALLOON_SIZE_1; + mWidth = BALLOON_WIDTH_1; + mHeight = BALLOON_WIDTH_1; + mSize = BALLOON_SIZE_1; + mPower = 1; // Inicializa los valores de velocidad y gravedad mVelX = velx; @@ -173,7 +183,7 @@ void Balloon::init(float x, float y, Uint8 kind, float velx, float speed, Uint16 mDefaultVelY = abs(velx) * 2; // Puntos que da el globo al ser destruido - mScore = 50; + mScore = BALLOON_SCORE_1; // Amenaza que genera el globo mMenace = 1; @@ -194,8 +204,10 @@ void Balloon::init(float x, float y, Uint8 kind, float velx, float speed, Uint16 mEnabled = true; // Alto y ancho del objeto - mWidth = BALLOON_SIZE_2; - mHeight = BALLOON_SIZE_2; + mWidth = BALLOON_WIDTH_2; + mHeight = BALLOON_WIDTH_2; + mSize = BALLOON_SIZE_2; + mPower = 3; // Inicializa los valores de velocidad y gravedad mVelX = velx; @@ -205,7 +217,7 @@ void Balloon::init(float x, float y, Uint8 kind, float velx, float speed, Uint16 mDefaultVelY = abs(velx) * 2; // Puntos que da el globo al ser destruido - mScore = 100; + mScore = BALLOON_SCORE_2; // Amenaza que genera el globo mMenace = 2; @@ -226,8 +238,10 @@ void Balloon::init(float x, float y, Uint8 kind, float velx, float speed, Uint16 mEnabled = true; // Alto y ancho del objeto - mWidth = BALLOON_SIZE_3; - mHeight = BALLOON_SIZE_3; + mWidth = BALLOON_WIDTH_3; + mHeight = BALLOON_WIDTH_3; + mSize = BALLOON_SIZE_3; + mPower = 7; // Inicializa los valores de velocidad y gravedad mVelX = velx; @@ -237,7 +251,7 @@ void Balloon::init(float x, float y, Uint8 kind, float velx, float speed, Uint16 mDefaultVelY = abs(velx) * 2; // Puntos que da el globo al ser destruido - mScore = 200; + mScore = BALLOON_SCORE_3; // Amenaza que genera el globo mMenace = 4; @@ -258,8 +272,10 @@ void Balloon::init(float x, float y, Uint8 kind, float velx, float speed, Uint16 mEnabled = true; // Alto y ancho del objeto - mWidth = BALLOON_SIZE_4; - mHeight = BALLOON_SIZE_4; + mWidth = BALLOON_WIDTH_4; + mHeight = BALLOON_WIDTH_4; + mSize = BALLOON_SIZE_4; + mPower = 15; // Inicializa los valores de velocidad y gravedad mVelX = velx; @@ -269,7 +285,7 @@ void Balloon::init(float x, float y, Uint8 kind, float velx, float speed, Uint16 mDefaultVelY = abs(velx) * 2; // Puntos que da el globo al ser destruido - mScore = 400; + mScore = BALLOON_SCORE_4; // Amenaza que genera el globo mMenace = 8; @@ -290,8 +306,10 @@ void Balloon::init(float x, float y, Uint8 kind, float velx, float speed, Uint16 mEnabled = true; // Alto y ancho del objeto - mWidth = BALLOON_SIZE_4; - mHeight = BALLOON_SIZE_4; + mWidth = BALLOON_WIDTH_4; + mHeight = BALLOON_WIDTH_4; + mSize = 4; + mPower = 0; // Inicializa los valores de velocidad y gravedad mVelX = velx; @@ -311,11 +329,15 @@ void Balloon::init(float x, float y, Uint8 kind, float velx, float speed, Uint16 mSprite->setAnimationFrames(BALLOON_MOVING_ANIMATION, i, OFFSET_POWER_BALL, 37 * i, getWidth(), getHeight()); for (Uint8 i = 0; i < NUM_FRAMES_BALLON_BORN; i++) - mSprite->setAnimationFrames(BALLOON_BORN_ANIMATION, i, OFFSET_BLUE_BALLOONS, 37 * i, getWidth(), getHeight()); + mSprite->setAnimationFrames(BALLOON_BORN_ANIMATION, i, OFFSET_POWER_BALL, 37 * i, getWidth(), getHeight()); for (Uint8 i = 0; i < NUM_FRAMES_BALLON_POP; i++) mSprite->setAnimationFrames(BALLOON_POP_ANIMATION, i, OFFSET_EXPLOSIONS, 37 * i, getWidth(), getHeight()); + // Añade rotación al sprite + mSprite->setRotate(false); + mSprite->setRotateSpeed(1); + mSprite->setRotateAmount(2.0); break; default: @@ -471,6 +493,9 @@ void Balloon::move() // Invierte sentido mVelX = -mVelX; + // Invierte la rotación + mSprite->switchRotate(); + // Activa el efecto de rebote bounceStart(); } @@ -539,33 +564,38 @@ void Balloon::move() // Deshabilita el globo y pone a cero todos los valores void Balloon::disable() { - mEnabled = false; - - mPosX = 0.0f; - mPosY = 0.0f; - mWidth = 0; - mHeight = 0; - mVelX = 0.0f; - mVelY = 0.0f; - mGravity = 0.0f; - mDefaultVelY = 0.0f; - mMaxVelY = 0.0f; mBeingCreated = false; mBlinking = false; - mInvulnerable = false; - mPopping = false; - mStopped = false; - mVisible = false; + mCollider.r = 0; mCollider.x = 0; mCollider.y = 0; - mCollider.r = 0; + mCounter = 0; mCreationCounter = 0; mCreationCounterIni = 0; + mDefaultVelY = 0.0f; + mEnabled = false; + mGravity = 0.0f; + mHeight = 0; + mInvulnerable = false; + mKind = 0; + mMaxVelY = 0.0f; + mMenace = 0; + mPopping = false; + mPosX = 0.0f; + mPosY = 0.0f; + mPower = 0; mScore = 0; + mSize = 0; + mSpeed = 0; + mStopped = false; mStoppedCounter = 0; mTimeToLive = 0; - mKind = 0; - mMenace = 0; + mTravelY = 0; + mVelX = 0.0f; + mVelY = 0.0f; + mVisible = false; + mWidth = 0; + mSprite->clear(); } // Explosiona el globo @@ -585,6 +615,7 @@ void Balloon::update() { if (mEnabled) { + mSprite->MovingSprite::update(); move(); updateAnimation(); updateColliders(); @@ -661,6 +692,14 @@ void Balloon::updateState() setStop(false); setVisible(true); setInvulnerable(false); + if (mKind == POWER_BALL) + { + mSprite->setRotate(true); + if (mVelX > 0.0f) + mSprite->setRotateAmount(2.0); + else + mSprite->setRotateAmount(-2.0); + } } } // Solo comprueba el estado detenido cuando no se está creando @@ -741,6 +780,12 @@ int Balloon::getKind() return mKind; } +// Obtiene del valor de la variable +Uint8 Balloon::getSize() +{ + return mSize; +} + // Obtiene la clase a la que pertenece el globo Uint8 Balloon::getClass() { @@ -877,6 +922,12 @@ Uint8 Balloon::getMenace() return 0; } +// Obtiene le valor de la variable +Uint8 Balloon::getPower() +{ + return mPower; +} + void Balloon::bounceStart() { mBouncing.enabled = true; diff --git a/source/balloon.h b/source/balloon.h index de6db8a..39db6a3 100644 --- a/source/balloon.h +++ b/source/balloon.h @@ -39,6 +39,8 @@ private: Uint32 mCounter; // Contador interno float mTravelY; // Distancia que ha de recorrer el globo en el eje Y antes de que se le aplique la gravedad float mSpeed; // Velocidad a la que se mueven los globos + Uint8 mSize; // Tamaño del globo + Uint8 mPower; // Cantidad de poder que alberga el globo struct bouncing // Estructura para las variables para el efecto de los rebotes { @@ -121,6 +123,9 @@ public: // Obtiene del valor de la variable int getKind(); + // Obtiene del valor de la variable + Uint8 getSize(); + // Obtiene la clase a la que pertenece el globo Uint8 getClass(); @@ -171,6 +176,9 @@ public: // Obtiene le valor de la variable Uint8 getMenace(); + + // Obtiene le valor de la variable + Uint8 getPower(); }; #endif diff --git a/source/const.h b/source/const.h index 52e275d..721c43b 100644 --- a/source/const.h +++ b/source/const.h @@ -7,7 +7,7 @@ // Textos #define WINDOW_CAPTION "Coffee Crisis" -#define TEXT_COPYRIGHT "@2020,2021 JAILDESIGNER (V1.4)" +#define TEXT_COPYRIGHT "@2020,2021 JAILDESIGNER (V1.5)" // Recursos #define BINFILE_SCORE 0 @@ -39,8 +39,9 @@ #define SOUND_STAGE_CHANGE 14 #define SOUND_TITLE 15 #define SOUND_CLOCK 16 +#define SOUND_POWERBALL 17 -#define TOTAL_SOUND 17 +#define TOTAL_SOUND 18 #define TEXTURE_BALLOON 0 #define TEXTURE_BULLET 1 @@ -151,6 +152,10 @@ const int SCREEN_THIRD_QUARTER_Y = (SCREEN_HEIGHT / 4) * 3; #define TITLE_SECTION_3 2 #define TITLE_SECTION_INSTRUCTIONS 3 +// Modos +#define MODE_AUTO 0 +#define MODE_MANUAL 1 + // Estados de cada elemento que pertenece a un evento #define EVENT_WAITING 1 #define EVENT_RUNNING 2 @@ -211,6 +216,18 @@ const int MULTIPLIER_NUMBER_Y = SCREEN_HEIGHT - (2 * BLOCK) + 2; #define HEXAGON_4 8 #define POWER_BALL 9 +// Puntos de globo +#define BALLOON_SCORE_1 50 +#define BALLOON_SCORE_2 100 +#define BALLOON_SCORE_3 200 +#define BALLOON_SCORE_4 400 + +// Tamaños de globo +#define BALLOON_SIZE_1 1 +#define BALLOON_SIZE_2 2 +#define BALLOON_SIZE_3 3 +#define BALLOON_SIZE_4 4 + // Clases de globo #define BALLOON_CLASS 0 #define HEXAGON_CLASS 1 @@ -235,10 +252,10 @@ const int MULTIPLIER_NUMBER_Y = SCREEN_HEIGHT - (2 * BLOCK) + 2; #define BALLOON_SPEED_5 1.00f // Tamaño de los globos -#define BALLOON_SIZE_1 8 -#define BALLOON_SIZE_2 13 -#define BALLOON_SIZE_3 21 -#define BALLOON_SIZE_4 37 +#define BALLOON_WIDTH_1 8 +#define BALLOON_WIDTH_2 13 +#define BALLOON_WIDTH_3 21 +#define BALLOON_WIDTH_4 37 // Tipos de bala #define BULLET_UP 1 diff --git a/source/gamedirector.cpp b/source/gamedirector.cpp index cb3871f..8155d53 100644 --- a/source/gamedirector.cpp +++ b/source/gamedirector.cpp @@ -180,7 +180,8 @@ void GameDirector::initProg() // Inicializa el objeto con el menu del titulo mMenu.title->init("TITLE", 0, 15 * BLOCK, MENU_BACKGROUND_SOLID, mTexture[TEXTURE_MENU].texture, mRenderer, mText.white); mMenu.title->addItem("PLAY"); - mMenu.title->addItem("OPTIONS", 0, 5); + mMenu.title->addItem("OPTIONS"); + mMenu.title->addItem("HOW TO PLAY", 0, 5); mMenu.title->addItem("QUIT"); mMenu.title->setDefaultActionWhenCancel(2); mMenu.title->setBackgroundColor(0x30, 0x30, 0x40, 192); @@ -668,6 +669,13 @@ void GameDirector::initTitle(Uint8 subsection) // Carga los recursos loadMediaTitle(); + // Inicializa las variables + resetTitle(subsection); +} + +// Resetea las variables necesarias para la sección 'Title' +void GameDirector::resetTitle(Uint8 subsection) +{ // Inicializa variables mTitle.section = subsection; mTitle.counter = TITLE_COUNTER; @@ -900,7 +908,7 @@ void GameDirector::resetGame() mGame.remainingExplosions = REMAINING_EXPLOSIONS; mGame.remainingExplosionsCounter = REMAINING_EXPLOSIONS_COUNTER; mGame.timeStopped = false; - mGame.timeStoppedCounter = TIME_STOPPED_COUNTER; + mGame.timeStoppedCounter = 0; mGame.counter = 0; mGame.balloonsPopped = 0; mGame.lastEnemyDeploy = 0; @@ -909,6 +917,7 @@ void GameDirector::resetGame() mGame.effect.flash = false; mGame.effect.shake = false; mGame.effect.shakeCounter = SHAKE_COUNTER; + mGame.powerBallEabled = false; initGameStages(); // Sprites @@ -1046,6 +1055,7 @@ bool GameDirector::loadMediaGame() mSound[SOUND_BUBBLE3].sound = JA_LoadSound(mSound[SOUND_BUBBLE3].file.c_str()); mSound[SOUND_BUBBLE4].sound = JA_LoadSound(mSound[SOUND_BUBBLE4].file.c_str()); mSound[SOUND_CLOCK].sound = JA_LoadSound(mSound[SOUND_CLOCK].file.c_str()); + mSound[SOUND_POWERBALL].sound = JA_LoadSound(mSound[SOUND_POWERBALL].file.c_str()); // Musicas mMusic[MUSIC_PLAYING].music = JA_LoadMusic(mMusic[MUSIC_PLAYING].file.c_str()); @@ -1081,6 +1091,7 @@ void GameDirector::quitGame() JA_DeleteSound(mSound[SOUND_BUBBLE3].sound); JA_DeleteSound(mSound[SOUND_BUBBLE4].sound); JA_DeleteSound(mSound[SOUND_CLOCK].sound); + JA_DeleteSound(mSound[SOUND_POWERBALL].sound); // Musicas JA_DeleteMusic(mMusic[MUSIC_PLAYING].music); @@ -1189,6 +1200,7 @@ void GameDirector::setFileList() mSound[SOUND_STAGE_CHANGE].file = mProg.executablePath + "/" + "../media/sound/stage_change.wav"; mSound[SOUND_TITLE].file = mProg.executablePath + "/" + "../media/sound/title.wav"; mSound[SOUND_CLOCK].file = mProg.executablePath + "/" + "../media/sound/clock.wav"; + mSound[SOUND_POWERBALL].file = mProg.executablePath + "/" + "../media/sound/powerball.wav"; // Texturas mTexture[TEXTURE_BALLOON].file = mProg.executablePath + "/" + "../media/gfx/balloon.png"; @@ -1577,23 +1589,23 @@ void GameDirector::initEnemyFormations() { const int y4 = (PLAY_AREA_TOP - BLOCK); const int x4_0 = PLAY_AREA_LEFT; - //const int x4_50 = PLAY_AREA_CENTER_X - (BALLOON_SIZE_4 / 2); - const int x4_100 = (PLAY_AREA_RIGHT)-BALLOON_SIZE_4; + //const int x4_50 = PLAY_AREA_CENTER_X - (BALLOON_WIDTH_4 / 2); + const int x4_100 = (PLAY_AREA_RIGHT)-BALLOON_WIDTH_4; const int y3 = (PLAY_AREA_TOP - BLOCK); const int x3_0 = PLAY_AREA_LEFT; - //const int x3_50 = PLAY_AREA_CENTER_X - (BALLOON_SIZE_3 / 2); - const int x3_100 = (PLAY_AREA_RIGHT)-BALLOON_SIZE_3; + //const int x3_50 = PLAY_AREA_CENTER_X - (BALLOON_WIDTH_3 / 2); + const int x3_100 = (PLAY_AREA_RIGHT)-BALLOON_WIDTH_3; const int y2 = (PLAY_AREA_TOP - BLOCK); const int x2_0 = PLAY_AREA_LEFT; - //const int x2_50 = PLAY_AREA_CENTER_X - (BALLOON_SIZE_2 / 2); - const int x2_100 = (PLAY_AREA_RIGHT)-BALLOON_SIZE_2; + //const int x2_50 = PLAY_AREA_CENTER_X - (BALLOON_WIDTH_2 / 2); + const int x2_100 = (PLAY_AREA_RIGHT)-BALLOON_WIDTH_2; const int y1 = (PLAY_AREA_TOP - BLOCK); const int x1_0 = PLAY_AREA_LEFT; - const int x1_50 = PLAY_AREA_CENTER_X - (BALLOON_SIZE_1 / 2); - const int x1_100 = (PLAY_AREA_RIGHT)-BALLOON_SIZE_1; + const int x1_50 = PLAY_AREA_CENTER_X - (BALLOON_WIDTH_1 / 2); + const int x1_100 = (PLAY_AREA_RIGHT)-BALLOON_WIDTH_1; const Uint16 creationTime = 300; int incX = 0; @@ -1621,7 +1633,7 @@ void GameDirector::initEnemyFormations() incTime = 0; for (Uint8 i = 0; i < mEnemyFormation[j].numberOfEnemies; i++) { - mEnemyFormation[j].init[i].x = PLAY_AREA_CENTER_FIRST_QUARTER_X - (BALLOON_SIZE_4 / 2) + (i * incX); + mEnemyFormation[j].init[i].x = PLAY_AREA_CENTER_FIRST_QUARTER_X - (BALLOON_WIDTH_4 / 2) + (i * incX); mEnemyFormation[j].init[i].y = y4; mEnemyFormation[j].init[i].velX = BALLOON_VELX_NEGATIVE * (((i % 2) * 2) - 1); mEnemyFormation[j].init[i].kind = BALLOON_4; @@ -1631,7 +1643,7 @@ void GameDirector::initEnemyFormations() // #02 - Cuatro enemigos BALLOON2 uno detras del otro. A la izquierda y hacia el centro j = 2; mEnemyFormation[j].numberOfEnemies = 4; - incX = BALLOON_SIZE_2 + 1; + incX = BALLOON_WIDTH_2 + 1; incTime = 10; for (Uint8 i = 0; i < mEnemyFormation[j].numberOfEnemies; i++) { @@ -1645,7 +1657,7 @@ void GameDirector::initEnemyFormations() // #03 - Cuatro enemigos BALLOON2 uno detras del otro. A la derecha y hacia el centro j = 3; mEnemyFormation[j].numberOfEnemies = 4; - incX = BALLOON_SIZE_2 + 1; + incX = BALLOON_WIDTH_2 + 1; incTime = 10; for (Uint8 i = 0; i < mEnemyFormation[j].numberOfEnemies; i++) { @@ -1659,7 +1671,7 @@ void GameDirector::initEnemyFormations() // #04 - Tres enemigos BALLOON3. 0, 25, 50. Hacia la derecha j = 4; mEnemyFormation[j].numberOfEnemies = 3; - incX = BALLOON_SIZE_3 * 2; + incX = BALLOON_WIDTH_3 * 2; incTime = 10; for (Uint8 i = 0; i < mEnemyFormation[j].numberOfEnemies; i++) { @@ -1673,7 +1685,7 @@ void GameDirector::initEnemyFormations() // #05 - Tres enemigos BALLOON3. 50, 75, 100. Hacia la izquierda j = 5; mEnemyFormation[j].numberOfEnemies = 3; - incX = BALLOON_SIZE_3 * 2; + incX = BALLOON_WIDTH_3 * 2; incTime = 10; for (Uint8 i = 0; i < mEnemyFormation[j].numberOfEnemies; i++) { @@ -1687,7 +1699,7 @@ void GameDirector::initEnemyFormations() // #06 - Tres enemigos BALLOON3. 0, 0, 0. Hacia la derecha j = 6; mEnemyFormation[j].numberOfEnemies = 3; - incX = BALLOON_SIZE_3 + 1; + incX = BALLOON_WIDTH_3 + 1; incTime = 10; for (Uint8 i = 0; i < mEnemyFormation[j].numberOfEnemies; i++) { @@ -1701,7 +1713,7 @@ void GameDirector::initEnemyFormations() // #07 - Tres enemigos BALLOON3. 100, 100, 100. Hacia la izquierda j = 7; mEnemyFormation[j].numberOfEnemies = 3; - incX = BALLOON_SIZE_3 + 1; + incX = BALLOON_WIDTH_3 + 1; incTime = 10; for (Uint8 i = 0; i < mEnemyFormation[j].numberOfEnemies; i++) { @@ -1715,7 +1727,7 @@ void GameDirector::initEnemyFormations() // #08 - Seis enemigos BALLOON1. 0, 0, 0, 0, 0, 0. Hacia la derecha j = 8; mEnemyFormation[j].numberOfEnemies = 6; - incX = BALLOON_SIZE_1 + 1; + incX = BALLOON_WIDTH_1 + 1; incTime = 10; for (Uint8 i = 0; i < mEnemyFormation[j].numberOfEnemies; i++) { @@ -1729,7 +1741,7 @@ void GameDirector::initEnemyFormations() // #09 - Seis enemigos BALLOON1. 100, 100, 100, 100, 100, 100. Hacia la izquierda j = 9; mEnemyFormation[j].numberOfEnemies = 6; - incX = BALLOON_SIZE_1 + 1; + incX = BALLOON_WIDTH_1 + 1; incTime = 10; for (Uint8 i = 0; i < mEnemyFormation[j].numberOfEnemies; i++) { @@ -1743,7 +1755,7 @@ void GameDirector::initEnemyFormations() // #10 - Tres enemigos BALLOON4 seguidos desde la izquierda j = 10; mEnemyFormation[j].numberOfEnemies = 3; - incX = BALLOON_SIZE_4 + 1; + incX = BALLOON_WIDTH_4 + 1; incTime = 15; for (Uint8 i = 0; i < mEnemyFormation[j].numberOfEnemies; i++) { @@ -1757,7 +1769,7 @@ void GameDirector::initEnemyFormations() // #11 - Tres enemigos BALLOON4 seguidos desde la derecha j = 11; mEnemyFormation[j].numberOfEnemies = 3; - incX = BALLOON_SIZE_4 + 1; + incX = BALLOON_WIDTH_4 + 1; incTime = 15; for (Uint8 i = 0; i < mEnemyFormation[j].numberOfEnemies; i++) { @@ -1771,7 +1783,7 @@ void GameDirector::initEnemyFormations() // #12 - Seis enemigos BALLOON2 uno detras del otro. A la izquierda y hacia el centro j = 12; mEnemyFormation[j].numberOfEnemies = 6; - incX = BALLOON_SIZE_2 + 1; + incX = BALLOON_WIDTH_2 + 1; incTime = 10; for (Uint8 i = 0; i < mEnemyFormation[j].numberOfEnemies; i++) { @@ -1785,7 +1797,7 @@ void GameDirector::initEnemyFormations() // #13 - Seis enemigos BALLOON2 uno detras del otro. A la derecha y hacia el centro j = 13; mEnemyFormation[j].numberOfEnemies = 6; - incX = BALLOON_SIZE_2 + 1; + incX = BALLOON_WIDTH_2 + 1; incTime = 10; for (Uint8 i = 0; i < mEnemyFormation[j].numberOfEnemies; i++) { @@ -1799,7 +1811,7 @@ void GameDirector::initEnemyFormations() // #14 - Cinco enemigos BALLOON3. Hacia la derecha. Separados j = 14; mEnemyFormation[j].numberOfEnemies = 5; - incX = BALLOON_SIZE_3 * 2; + incX = BALLOON_WIDTH_3 * 2; incTime = 10; for (Uint8 i = 0; i < mEnemyFormation[j].numberOfEnemies; i++) { @@ -1813,7 +1825,7 @@ void GameDirector::initEnemyFormations() // #15 - Cinco enemigos BALLOON3. Hacia la izquierda. Separados j = 15; mEnemyFormation[j].numberOfEnemies = 5; - incX = BALLOON_SIZE_3 * 2; + incX = BALLOON_WIDTH_3 * 2; incTime = 10; for (Uint8 i = 0; i < mEnemyFormation[j].numberOfEnemies; i++) { @@ -1827,7 +1839,7 @@ void GameDirector::initEnemyFormations() // #16 - Cinco enemigos BALLOON3. Hacia la derecha. Juntos j = 16; mEnemyFormation[j].numberOfEnemies = 5; - incX = BALLOON_SIZE_3 + 1; + incX = BALLOON_WIDTH_3 + 1; incTime = 10; for (Uint8 i = 0; i < mEnemyFormation[j].numberOfEnemies; i++) { @@ -1841,7 +1853,7 @@ void GameDirector::initEnemyFormations() // #17 - Cinco enemigos BALLOON3. Hacia la izquierda. Juntos j = 17; mEnemyFormation[j].numberOfEnemies = 5; - incX = BALLOON_SIZE_3 + 1; + incX = BALLOON_WIDTH_3 + 1; incTime = 10; for (Uint8 i = 0; i < mEnemyFormation[j].numberOfEnemies; i++) { @@ -1855,7 +1867,7 @@ void GameDirector::initEnemyFormations() // #18 - Doce enemigos BALLOON1. Hacia la derecha. Juntos j = 18; mEnemyFormation[j].numberOfEnemies = 12; - incX = BALLOON_SIZE_1 + 1; + incX = BALLOON_WIDTH_1 + 1; incTime = 10; for (Uint8 i = 0; i < mEnemyFormation[j].numberOfEnemies; i++) { @@ -1869,7 +1881,7 @@ void GameDirector::initEnemyFormations() // #19 - Doce enemigos BALLOON1. Hacia la izquierda. Juntos j = 19; mEnemyFormation[j].numberOfEnemies = 12; - incX = BALLOON_SIZE_1 + 1; + incX = BALLOON_WIDTH_1 + 1; incTime = 10; for (Uint8 i = 0; i < mEnemyFormation[j].numberOfEnemies; i++) { @@ -1883,7 +1895,7 @@ void GameDirector::initEnemyFormations() // #20 - Dos enemigos BALLOON4 seguidos desde la izquierda/derecha. Simetricos j = 20; mEnemyFormation[j].numberOfEnemies = 4; - incX = BALLOON_SIZE_4 + 1; + incX = BALLOON_WIDTH_4 + 1; incTime = 0; for (Uint8 i = 0; i < mEnemyFormation[j].numberOfEnemies; i++) { @@ -1906,7 +1918,7 @@ void GameDirector::initEnemyFormations() // #21 - Diez enemigos BALLOON2 uno detras del otro. Izquierda/derecha. Simetricos j = 21; mEnemyFormation[j].numberOfEnemies = 10; - incX = BALLOON_SIZE_2 + 1; + incX = BALLOON_WIDTH_2 + 1; incTime = 3; for (Uint8 i = 0; i < mEnemyFormation[j].numberOfEnemies; i++) { @@ -1930,7 +1942,7 @@ void GameDirector::initEnemyFormations() // #22 - Diez enemigos BALLOON3. Hacia la derecha/izquierda. Separados. Simetricos j = 22; mEnemyFormation[j].numberOfEnemies = 10; - incX = BALLOON_SIZE_3 * 2; + incX = BALLOON_WIDTH_3 * 2; incTime = 10; for (Uint8 i = 0; i < mEnemyFormation[j].numberOfEnemies; i++) { @@ -1954,7 +1966,7 @@ void GameDirector::initEnemyFormations() // #23 - Diez enemigos BALLOON3. Hacia la derecha. Juntos. Simetricos j = 23; mEnemyFormation[j].numberOfEnemies = 10; - incX = BALLOON_SIZE_3 + 1; + incX = BALLOON_WIDTH_3 + 1; incTime = 10; for (Uint8 i = 0; i < mEnemyFormation[j].numberOfEnemies; i++) { @@ -2002,7 +2014,7 @@ void GameDirector::initEnemyFormations() // #25 - Treinta enemigos BALLOON1. Del centro hacia adentro. Juntos. Simetricos j = 25; mEnemyFormation[j].numberOfEnemies = 30; - incX = BALLOON_SIZE_1 + 1; + incX = BALLOON_WIDTH_1 + 1; incTime = 5; for (Uint8 i = 0; i < mEnemyFormation[j].numberOfEnemies; i++) { @@ -2279,36 +2291,51 @@ void GameDirector::deployEnemyFormation() // Solo despliega una formación enemiga si ha pasado cierto tiempo desde la última if (mGame.enemyDeployCounter == 0) { - mGame.enemyDeployCounter = 255; - Uint8 set = (rand() % 10); - - if (set == mGame.lastEnemyDeploy) + // En este punto se decide entre crear una powerball o una formación enemiga + if ((rand() % 100 < 15) && (canPowerBallBeCreated())) { - set++; - set %= 10; + // Crea una powerball + createPowerBall(); + + mGame.enemyDeployCounter = 50; } - mGame.lastEnemyDeploy = set; + else + { - if (mDebug.enabled) - set = mDebug.enemySet; + // Elige una formación enemiga la azar + Uint8 set = (rand() % 10); - Uint8 numEnemies = mGame.stage[mGame.currentStage].enemyPool->set[set]->numberOfEnemies; - for (Uint8 i = 0; i < numEnemies; i++) - createNewBalloon(mGame.stage[mGame.currentStage].enemyPool->set[set]->init[i].x, - mGame.stage[mGame.currentStage].enemyPool->set[set]->init[i].y, - mGame.stage[mGame.currentStage].enemyPool->set[set]->init[i].kind, - mGame.stage[mGame.currentStage].enemyPool->set[set]->init[i].velX, - mGame.enemySpeed, - mGame.stage[mGame.currentStage].enemyPool->set[set]->init[i].creationCounter, - mTexture[TEXTURE_BALLOON].texture); + // Evita repetir la ultima formación enemiga desplegada + if (set == mGame.lastEnemyDeploy) + { + set++; + set %= 10; + } + mGame.lastEnemyDeploy = set; + + if (mDebug.enabled) + set = mDebug.enemySet; + + Uint8 numEnemies = mGame.stage[mGame.currentStage].enemyPool->set[set]->numberOfEnemies; + for (Uint8 i = 0; i < numEnemies; i++) + createNewBalloon(mGame.stage[mGame.currentStage].enemyPool->set[set]->init[i].x, + mGame.stage[mGame.currentStage].enemyPool->set[set]->init[i].y, + mGame.stage[mGame.currentStage].enemyPool->set[set]->init[i].kind, + mGame.stage[mGame.currentStage].enemyPool->set[set]->init[i].velX, + mGame.enemySpeed, + mGame.stage[mGame.currentStage].enemyPool->set[set]->init[i].creationCounter, + mTexture[TEXTURE_BALLOON].texture); + + mGame.enemyDeployCounter = 255; + } } } // Aumenta el poder de la fase -void GameDirector::increaseStageCurrentPower() +void GameDirector::increaseStageCurrentPower(Uint8 power) { - mGame.stage[mGame.currentStage].currentPower++; + mGame.stage[mGame.currentStage].currentPower += power; } // Establece el valor de la variable @@ -2602,14 +2629,15 @@ Uint8 GameDirector::createNewBalloon(float x, int y, Uint8 kind, float velx, flo // Crea una PowerBall void GameDirector::createPowerBall() { - const int y4 = (PLAY_AREA_TOP - BLOCK); - const int x4_0 = PLAY_AREA_LEFT; - const int x4_50 = PLAY_AREA_CENTER_X - (BALLOON_SIZE_4 / 2); - const int x4_100 = (PLAY_AREA_RIGHT)-BALLOON_SIZE_4; - const int x[3] = {x4_0, x4_50, x4_100}; - int x4 = x[rand() % 3]; + const int posY = (PLAY_AREA_TOP); + const int left = PLAY_AREA_LEFT; + const int center = PLAY_AREA_CENTER_X - (BALLOON_WIDTH_4 / 2); + const int right = (PLAY_AREA_RIGHT)-BALLOON_WIDTH_4; + const int x[3] = {left, center, right}; + int posX = x[rand() % 3]; - mGame.balloon[getBalloonFreeIndex()]->init(x4, y4, POWER_BALL, BALLOON_VELX_POSITIVE * (((rand() % 2) * 2) - 1), mGame.enemySpeed, 350, mTexture[TEXTURE_BALLOON].texture, mRenderer); + mGame.balloon[getBalloonFreeIndex()]->init(posX, posY, POWER_BALL, BALLOON_VELX_POSITIVE * (((rand() % 2) * 2) - 1), mGame.enemySpeed, 100, mTexture[TEXTURE_BALLOON].texture, mRenderer); + mGame.powerBallEabled = true; } // Establece a cero todos los valores del vector de objetos globo @@ -2688,88 +2716,115 @@ void GameDirector::updateBalloonSpeed() // Explosiona un globo. Lo destruye y crea otros dos si es el caso void GameDirector::popBalloon(Uint8 index) { - //if (mGame.balloon[index]->isActive()) + // Otorga los puntos correspondientes al globo + mGame.player->addScore(Uint32(mGame.balloon[index]->getScore() * mGame.player->getScoreMultiplier())); + setScore(mGame.player->getScore()); + updateHiScore(); + + // Aumenta el poder de la fase + increaseStageCurrentPower(1); + mGame.balloonsPopped++; + + Uint8 kind = mGame.balloon[index]->getKind(); + Uint8 freeIndex = 0; + switch (kind) { - // Otorga los puntos correspondientes al globo - mGame.player->addScore(Uint32(mGame.balloon[index]->getScore() * mGame.player->getScoreMultiplier())); - setScore(mGame.player->getScore()); - updateHiScore(); + // Si es del tipo más pequeño, simplemente elimina el globo + case BALLOON_1: + mGame.balloon[index]->pop(); + break; - // Aumenta el poder de la fase - increaseStageCurrentPower(); - mGame.balloonsPopped++; + case HEXAGON_1: + mGame.balloon[index]->pop(); + break; - Uint8 kind = mGame.balloon[index]->getKind(); - Uint8 freeIndex = 0; - switch (kind) - { - // Si es del tipo más pequeño, simplemente elimina el globo - case BALLOON_1: - mGame.balloon[index]->pop(); - break; + // Si es del tipo PowerBall, destruye todos los globos + case POWER_BALL: + destroyAllBalloons(); + mGame.powerBallEabled = false; + break; - case HEXAGON_1: - mGame.balloon[index]->pop(); - break; + // En cualquier otro caso, crea dos globos de un tipo inferior + default: + freeIndex = getBalloonFreeIndex(); + mGame.balloon[freeIndex]->init(0, mGame.balloon[index]->getPosY(), mGame.balloon[index]->getKind() - 1, BALLOON_VELX_NEGATIVE, mGame.enemySpeed, 0, mTexture[TEXTURE_BALLOON].texture, mRenderer); + mGame.balloon[freeIndex]->allignTo(mGame.balloon[index]->getPosX() + (mGame.balloon[index]->getWidth() / 2)); + if (mGame.balloon[freeIndex]->getClass() == BALLOON_CLASS) + mGame.balloon[freeIndex]->setVelY(-2.50f); + else if (mGame.balloon[freeIndex]->getClass() == HEXAGON_CLASS) + mGame.balloon[freeIndex]->setVelY(BALLOON_VELX_NEGATIVE); - // Si es del tipo PowerBall, destruye todos los globos - case POWER_BALL: - destroyAllBalloons(); - break; + freeIndex = getBalloonFreeIndex(); + mGame.balloon[freeIndex]->init(0, mGame.balloon[index]->getPosY(), mGame.balloon[index]->getKind() - 1, BALLOON_VELX_POSITIVE, mGame.enemySpeed, 0, mTexture[TEXTURE_BALLOON].texture, mRenderer); + mGame.balloon[freeIndex]->allignTo(mGame.balloon[index]->getPosX() + (mGame.balloon[index]->getWidth() / 2)); + if (mGame.balloon[freeIndex]->getClass() == BALLOON_CLASS) + mGame.balloon[freeIndex]->setVelY(-2.50f); + else if (mGame.balloon[freeIndex]->getClass() == HEXAGON_CLASS) + mGame.balloon[freeIndex]->setVelY(BALLOON_VELX_NEGATIVE); - // En cualquier otro caso, crea dos globos de un tipo inferior - default: - freeIndex = getBalloonFreeIndex(); - mGame.balloon[freeIndex]->init(0, mGame.balloon[index]->getPosY(), mGame.balloon[index]->getKind() - 1, BALLOON_VELX_NEGATIVE, mGame.enemySpeed, 0, mTexture[TEXTURE_BALLOON].texture, mRenderer); - mGame.balloon[freeIndex]->allignTo(mGame.balloon[index]->getPosX() + (mGame.balloon[index]->getWidth() / 2)); - if (mGame.balloon[freeIndex]->getClass() == BALLOON_CLASS) - mGame.balloon[freeIndex]->setVelY(-2.50f); - else if (mGame.balloon[freeIndex]->getClass() == HEXAGON_CLASS) - mGame.balloon[freeIndex]->setVelY(BALLOON_VELX_NEGATIVE); - - freeIndex = getBalloonFreeIndex(); - mGame.balloon[freeIndex]->init(0, mGame.balloon[index]->getPosY(), mGame.balloon[index]->getKind() - 1, BALLOON_VELX_POSITIVE, mGame.enemySpeed, 0, mTexture[TEXTURE_BALLOON].texture, mRenderer); - mGame.balloon[freeIndex]->allignTo(mGame.balloon[index]->getPosX() + (mGame.balloon[index]->getWidth() / 2)); - if (mGame.balloon[freeIndex]->getClass() == BALLOON_CLASS) - mGame.balloon[freeIndex]->setVelY(-2.50f); - else if (mGame.balloon[freeIndex]->getClass() == HEXAGON_CLASS) - mGame.balloon[freeIndex]->setVelY(BALLOON_VELX_NEGATIVE); - - // Elimina el globo - mGame.balloon[index]->pop(); - break; - } - - // Recalcula el nivel de amenaza - setMenace(); + // Elimina el globo + mGame.balloon[index]->pop(); + break; } + + // Recalcula el nivel de amenaza + setMenace(); } // Explosiona un globo. Lo destruye void GameDirector::destroyBalloon(Uint8 index) { - //if (mGame.balloon[index]->isActive()) + int score = 0; + Uint8 power = 0; + // Calcula la puntuación y el poder que generaria el globo en caso de romperlo a él y a sus hijos + switch (mGame.balloon[index]->getSize()) { - // Otorga los puntos correspondientes al globo - mGame.player->addScore(Uint32(mGame.balloon[index]->getScore() * mGame.player->getScoreMultiplier())); - setScore(mGame.player->getScore()); - updateHiScore(); + case BALLOON_SIZE_4: + score = BALLOON_SCORE_4 + (2 * BALLOON_SCORE_3) + (4 * BALLOON_SCORE_2) + (8 * BALLOON_SCORE_1); + power = 15; + break; - // Aumenta el poder de la fase - increaseStageCurrentPower(); - mGame.balloonsPopped++; + case BALLOON_SIZE_3: + score = BALLOON_SCORE_3 + (2 * BALLOON_SCORE_2) + (4 * BALLOON_SCORE_1); + power = 7; + break; - // Destruye el globo - mGame.balloon[index]->pop(); + case BALLOON_SIZE_2: + score = BALLOON_SCORE_2 + (2 * BALLOON_SCORE_1); + power = 3; + break; - // Recalcula el nivel de amenaza - setMenace(); + case BALLOON_SIZE_1: + score = BALLOON_SCORE_1; + power = 1; + break; + + default: + score = 0; + power = 0; + break; } + + // Otorga los puntos correspondientes al globo + mGame.player->addScore(Uint32(score * mGame.player->getScoreMultiplier())); + setScore(mGame.player->getScore()); + updateHiScore(); + + // Aumenta el poder de la fase + increaseStageCurrentPower(power); + mGame.balloonsPopped += power; + + // Destruye el globo + mGame.balloon[index]->pop(); + + // Recalcula el nivel de amenaza + setMenace(); } // Explosiona todos los globos void GameDirector::popAllBalloons() { + /* int candidate[MAX_BALLOONS]; Uint8 j = 0; for (Uint8 i = 0; i < MAX_BALLOONS; i++) @@ -2783,26 +2838,22 @@ void GameDirector::popAllBalloons() for (Uint8 i = 0; i < MAX_BALLOONS; i++) if (candidate[i] >= 0) popBalloon(i); + */ + for (Uint8 i = 0; i < MAX_BALLOONS; i++) + if ((mGame.balloon[i]->isEnabled()) && (!mGame.balloon[i]->isPopping()) && (!mGame.balloon[i]->isBeingCreated())) + popBalloon(i); + JA_PlaySound(mSound[SOUND_BALLOON].sound); } // Destruye todos los globos void GameDirector::destroyAllBalloons() { - int candidate[MAX_BALLOONS]; - Uint8 j = 0; for (Uint8 i = 0; i < MAX_BALLOONS; i++) - { if ((mGame.balloon[i]->isEnabled()) && (!mGame.balloon[i]->isPopping()) && (!mGame.balloon[i]->isBeingCreated())) - candidate[j] = i; - else - candidate[j] = -1; - j++; - } - for (Uint8 i = 0; i < MAX_BALLOONS; i++) - if (candidate[i] >= 0) destroyBalloon(i); - JA_PlaySound(mSound[SOUND_BALLOON].sound); + + JA_PlaySound(mSound[SOUND_POWERBALL].sound); mGame.effect.flash = true; mGame.effect.shake = true; } @@ -2930,11 +2981,11 @@ void GameDirector::checkBulletBalloonCollision() Uint8 droppeditem = dropItem(); if ((droppeditem != NO_KIND) && !(mDemo.enabled) && !(mDemo.recording)) { - if (droppeditem == ITEM_POWER_BALL) + /*if (droppeditem == ITEM_POWER_BALL) { createPowerBall(); } - else + else*/ { createItem(mGame.balloon[i]->getPosX(), mGame.balloon[i]->getPosY(), droppeditem); JA_PlaySound(mSound[SOUND_ITEM_DROP].sound); @@ -3050,10 +3101,10 @@ void GameDirector::resetItems() // Devuelve un item en función del azar Uint8 GameDirector::dropItem() { - return ITEM_COFFEE; + //return ITEM_COFFEE; Uint8 luckyNumber = rand() % 99; - Uint8 item = rand() % 7; + Uint8 item = rand() % 6; switch (item) { case 0: @@ -3080,11 +3131,12 @@ Uint8 GameDirector::dropItem() if (luckyNumber < 5) return ITEM_COFFEE; break; - case 6: + /*case 6: if (luckyNumber < 5) if (countBalloons() > 10) - return ITEM_POWER_BALL; - break; + if (!mGame.powerBallEabled) + return ITEM_POWER_BALL; + break;*/ default: break; } @@ -3159,8 +3211,8 @@ void GameDirector::throwCoffee(int x, int y) mGame.smartSprite[index]->setEnabledTimer(1); mGame.smartSprite[index]->setSpriteClip(80, 16, 16, 16); mGame.smartSprite[index]->setRotate(true); - mGame.smartSprite[index]->setRotateSpeed(1); - mGame.smartSprite[index]->setRotateAmount(5.0); + mGame.smartSprite[index]->setRotateSpeed(10); + mGame.smartSprite[index]->setRotateAmount(90.0); } // Crea un SmartSprite para arrojar el item café al recibir un impacto @@ -3346,6 +3398,12 @@ void GameDirector::setTimeStoppedCounter(Uint16 value) mGame.timeStoppedCounter = value; } +// Incrementa el valor de la variable +void GameDirector::incTimeStoppedCounter(Uint16 value) +{ + mGame.timeStoppedCounter += value; +} + // Actualiza y comprueba el valor de la variable void GameDirector::updateTimeStoppedCounter() { @@ -4056,7 +4114,7 @@ void GameDirector::enableTimeStopItem() { stopAllBalloons(TIME_STOPPED_COUNTER); setTimeStopped(true); - setTimeStoppedCounter(TIME_STOPPED_COUNTER); + incTimeStoppedCounter(TIME_STOPPED_COUNTER); if (JA_GetMusicState() == JA_MUSIC_PLAYING) { JA_PauseMusic(); @@ -4067,7 +4125,8 @@ void GameDirector::enableTimeStopItem() void GameDirector::disableTimeStopItem() { mGame.timeStopped = false; - mGame.timeStoppedCounter = TIME_STOPPED_COUNTER; + setTimeStoppedCounter(0); + //mGame.timeStoppedCounter = TIME_STOPPED_COUNTER; startAllBalloons(); if (JA_GetMusicState() == JA_MUSIC_PAUSED) { @@ -4634,9 +4693,7 @@ void GameDirector::runTitle(Uint8 subsection) mTitle.coffeeBitmap->render(); mTitle.crisisBitmap->render(); if (mTitle.menuVisible == true) - { mMenu.active->render(); - } mTitle.dustBitmapR->animate(0); mTitle.dustBitmapL->animate(0); mTitle.dustBitmapR->render(); @@ -4673,27 +4730,36 @@ void GameDirector::runTitle(Uint8 subsection) { switch (mMenu.active->getItemSelected()) { - case 0: - setProgSection(PROG_SECTION_GAME); + case 0: // PLAY + JA_PlaySound(mSound[SOUND_MENU_SELECT].sound); mMenu.active->reset(); mMenu.keyPressed = false; - JA_PlaySound(mSound[SOUND_MENU_SELECT].sound); + setProgSection(PROG_SECTION_GAME); renderFade(1); JA_StopMusic(); disableDemoMode(); break; - case 1: + case 1: // OPTIONS JA_PlaySound(mSound[SOUND_MENU_SELECT].sound); mMenu.active->reset(); + mMenu.keyPressed = false; mMenu.active = mMenu.options; mOptions.fullScreenModePrevious = mOptions.fullScreenMode; mOptions.windowSizePrevious = mOptions.windowSize; break; - case 2: - mProg.quit = true; + case 2: // HOW TO PLAY + JA_PlaySound(mSound[SOUND_MENU_SELECT].sound); mMenu.active->reset(); mMenu.keyPressed = false; + mTitle.section = TITLE_SECTION_INSTRUCTIONS; + //runInstructions(MODE_MANUAL); + //setProgSection(PROG_SECTION_TITLE,TITLE_SECTION_INSTRUCTIONS); + break; + case 3: // QUIT JA_PlaySound(mSound[SOUND_MENU_CANCEL].sound); + mMenu.active->reset(); + mMenu.keyPressed = false; + mProg.quit = true; renderFade(1); JA_StopMusic(); break; @@ -4761,7 +4827,7 @@ void GameDirector::runTitle(Uint8 subsection) // Sección Instrucciones if (mTitle.section == TITLE_SECTION_INSTRUCTIONS) - runInstructions(); + runInstructions(MODE_AUTO); } quitTitle(); @@ -4879,7 +4945,9 @@ void GameDirector::runGame() // Volca el contenido de la textura en el renderizador SDL_RenderCopy(mRenderer, mBackbuffer, NULL, NULL); + // Pinta la informacion de debug renderDebugInfo(); + // Actualiza la pantalla SDL_RenderPresent(mRenderer); } @@ -4965,22 +5033,22 @@ void GameDirector::runPausedGame() } // Bucle para la pantalla de instrucciones -void GameDirector::runInstructions() +void GameDirector::runInstructions(Uint8 mode) { SDL_Rect window = {0, 0, SCREEN_WIDTH, SCREEN_HEIGHT}; Sprite *sprite = new Sprite(); - SDL_Rect rect1 = {60, 88, 16, 16}; // Disquito - SDL_Rect rect2 = {60, 104, 16, 16}; // Gavineixon - SDL_Rect rect3 = {60, 120, 16, 16}; // Pacmar - SDL_Rect rect4 = {60, 136, 16, 16}; // Time Stopper - SDL_Rect rect5 = {60, 152, 16, 16}; // Explosive - SDL_Rect rect6 = {60, 168, 16, 16}; // Coffee - SDL_Rect rect = {0, 0, 16, 16}; - sprite->init(rect1, mTexture[TEXTURE_ITEMS].texture, mRenderer); + SDL_Rect srcRect = {0, 0, 16, 16}; + + const SDL_Rect destRect1 = {60, 88 + (16 * 0), 16, 16}; // Disquito + const SDL_Rect destRect2 = {60, 88 + (16 * 1), 16, 16}; // Gavineixon + const SDL_Rect destRect3 = {60, 88 + (16 * 2), 16, 16}; // Pacmar + const SDL_Rect destRect4 = {60, 88 + (16 * 3), 16, 16}; // Time Stopper + const SDL_Rect destRect5 = {60, 88 + (16 * 4), 16, 16}; // Coffee + + sprite->init(destRect1, mTexture[TEXTURE_ITEMS].texture, mRenderer); while ((mTitle.section == TITLE_SECTION_INSTRUCTIONS) && (!exit())) { - int y = 0; // Comprueba los eventos que hay en la cola while (SDL_PollEvent(mEventHandler) != 0) { @@ -5012,40 +5080,44 @@ void GameDirector::runInstructions() mText.white->write(84, 108, "2.500 POINTS", 0); mText.white->write(84, 124, "5.000 POINTS", 0); mText.white->write(84, 140, "TIME STOPPER", 0); - mText.white->write(84, 156, "FOUR EXPLOSIONS", 0); - mText.white->write(84, 172, "EXTRA HIT", 0); + mText.white->write(84, 156, "EXTRA HIT", 0); - sprite->init(rect1, mTexture[TEXTURE_ITEMS].texture, mRenderer); - sprite->setSpriteClip(rect); - rect.x += rect.w; - rect.y = 16 * (((mTitle.instructionsCounter + 3) / 36) % 2); - sprite->render(); - sprite->init(rect2, mTexture[TEXTURE_ITEMS].texture, mRenderer); - sprite->setSpriteClip(rect); - rect.x += rect.w; - rect.y = 16 * (((mTitle.instructionsCounter + 6) / 36) % 2); - sprite->render(); - sprite->init(rect3, mTexture[TEXTURE_ITEMS].texture, mRenderer); - sprite->setSpriteClip(rect); - rect.x += rect.w; - rect.y = 16 * (((mTitle.instructionsCounter + 9) / 36) % 2); - sprite->render(); - sprite->init(rect4, mTexture[TEXTURE_ITEMS].texture, mRenderer); - sprite->setSpriteClip(rect); - rect.x += rect.w; - rect.y = 16 * (((mTitle.instructionsCounter + 12) / 36) % 2); - sprite->render(); - sprite->init(rect5, mTexture[TEXTURE_ITEMS].texture, mRenderer); - sprite->setSpriteClip(rect); - rect.x += rect.w; - rect.y = 16 * (((mTitle.instructionsCounter + 15) / 36) % 2); - sprite->render(); - sprite->init(rect6, mTexture[TEXTURE_ITEMS].texture, mRenderer); - sprite->setSpriteClip(rect); - rect.x = 0; - rect.y = 16 * (((mTitle.instructionsCounter + 0) / 36) % 2); + // Disquito + sprite->init(destRect1, mTexture[TEXTURE_ITEMS].texture, mRenderer); + srcRect.x = 0; + srcRect.y = 16 * (((mTitle.instructionsCounter + 0) / 36) % 2); + sprite->setSpriteClip(srcRect); sprite->render(); + // Gavineixon + sprite->init(destRect2, mTexture[TEXTURE_ITEMS].texture, mRenderer); + srcRect.x += srcRect.w; + srcRect.y = 16 * (((mTitle.instructionsCounter + 3) / 36) % 2); + sprite->setSpriteClip(srcRect); + sprite->render(); + + // Pacmar + sprite->init(destRect3, mTexture[TEXTURE_ITEMS].texture, mRenderer); + srcRect.x += srcRect.w; + srcRect.y = 16 * (((mTitle.instructionsCounter + 6) / 36) % 2); + sprite->setSpriteClip(srcRect); + sprite->render(); + + // Time Stopper + sprite->init(destRect4, mTexture[TEXTURE_ITEMS].texture, mRenderer); + srcRect.x += srcRect.w; + srcRect.y = 16 * (((mTitle.instructionsCounter + 9) / 36) % 2); + sprite->setSpriteClip(srcRect); + sprite->render(); + + // Coffee + sprite->init(destRect5, mTexture[TEXTURE_ITEMS].texture, mRenderer); + srcRect.x += (srcRect.w * 2); // Se salta el icono del TNT + srcRect.y = 16 * (((mTitle.instructionsCounter + 12) / 36) % 2); + sprite->setSpriteClip(srcRect); + sprite->render(); + + // Cambia el destino de renderizado SDL_SetRenderTarget(mRenderer, nullptr); // Limpia la pantalla @@ -5053,13 +5125,7 @@ void GameDirector::runInstructions() SDL_RenderClear(mRenderer); // Dibuja los objetos - y = SCREEN_HEIGHT - (INSTRUCTIONS_COUNTER - mTitle.instructionsCounter) + 100; - if (y < 0) - { - y = 0; - } - - window.y = y; + window.y = std::max(0, SCREEN_HEIGHT - (INSTRUCTIONS_COUNTER - mTitle.instructionsCounter) + 100); SDL_RenderCopy(mRenderer, mInstructionsSurface, NULL, &window); // Muestra la pantalla @@ -5069,9 +5135,17 @@ void GameDirector::runInstructions() if (mTitle.instructionsCounter == 0) { - mTitle.instructionsCounter = INSTRUCTIONS_COUNTER; - mTitle.section = TITLE_SECTION_1; + resetTitle(TITLE_SECTION_1); + mTitle.section = TITLE_SECTION_3; mTitle.nextProgSection = PROG_SECTION_LOGO; + + // Prepara las variables para la sección 3 del titulo + mTitle.dustBitmapL->setEnabled(false); + mTitle.dustBitmapR->setEnabled(false); + mTitle.menuVisible = true; + mTitle.coffeeBitmap->setPosY(11); + mTitle.crisisBitmap->setPosY(57); + mMenu.title->setSelectorPos(2); } } delete sprite; @@ -5201,4 +5275,27 @@ void GameDirector::renderDebugInfo() mText.white->writeShadowed(2, 2 + 8 * BLOCK, "balloonsPop: " + std::to_string(mGame.balloonsPopped), R, G, B); mText.white->writeShadowed(2, 2 + 9 * BLOCK, "(Z-X)ballSped:" + std::to_string(mGame.enemySpeed), R, G, B); } +} + +// Indica si se puede crear una powerball +bool GameDirector::canPowerBallBeCreated() +{ + bool success = false; + + if ((!mGame.powerBallEabled) && (calculateScreenPower() > 0)) + success = true; + else + success = false; + + return success; +} + +// Calcula el poder actual de los globos en pantalla +int GameDirector::calculateScreenPower() +{ + int power = 0; + for (Uint8 i = 0; i < MAX_BALLOONS; i++) + if (mGame.balloon[i]->isEnabled()) + power += mGame.balloon[i]->getPower(); + return power; } \ No newline at end of file diff --git a/source/gamedirector.h b/source/gamedirector.h index 42dae46..9570802 100644 --- a/source/gamedirector.h +++ b/source/gamedirector.h @@ -153,6 +153,7 @@ private: Uint8 enemyDeployCounter; // Cuando se lanza una formación, se le da un valor y no sale otra hasta que llegue a cero float enemySpeed; // Velocidad a la que se mueven los enemigos effect_t effect; // Variable para gestionar los efectos visuales + bool powerBallEabled; // Indica si hay una powerball ya activa }; game_t mGame; // Variable con todas las variables usadas durante el juego @@ -300,6 +301,9 @@ public: // Inicializa las variables necesarias para la sección 'Title' void initTitle(Uint8 subsection = TITLE_SECTION_1); + // Resetea las variables necesarias para la sección 'Title' + void resetTitle(Uint8 subsection = TITLE_SECTION_1); + // Carga los recursos necesarios para la sección 'Title' bool loadMediaTitle(); @@ -364,7 +368,7 @@ public: void deployEnemyFormation(); // Aumenta el poder de la fase - void increaseStageCurrentPower(); + void increaseStageCurrentPower(Uint8 power); // Establece el valor de la variable void setScore(Uint32 score); @@ -553,6 +557,9 @@ public: // Establece el valor de la variable void setTimeStoppedCounter(Uint16 value); + // Incrementa el valor de la variable + void incTimeStoppedCounter(Uint16 value); + // Actualiza la variable EnemyDeployCounter void updateEnemyDeployCounter(); @@ -644,7 +651,7 @@ public: void runPausedGame(); // Bucle para la pantalla de instrucciones - void runInstructions(); + void runInstructions(Uint8 mode); // Bucle para la pantalla de game over void runGameOverScreen(); @@ -660,6 +667,12 @@ public: // Dibuja la informacion de debug en pantalla void renderDebugInfo(); + + // Indica si se puede crear una powerball + bool canPowerBallBeCreated(); + + // Calcula el poder actual de los globos en pantalla + int calculateScreenPower(); }; #endif diff --git a/source/menu.h b/source/menu.h index 3201c54..25e6df4 100644 --- a/source/menu.h +++ b/source/menu.h @@ -63,6 +63,9 @@ public: // Establece el indice del item que se usará por defecto al cancelar el menu void setDefaultActionWhenCancel(Uint8 item); + // Coloca el selector en una posición específica + void setSelectorPos(Uint8 index); + private: // Establece el valor de la variable void setTotalItems(int num); @@ -91,9 +94,6 @@ private: // Establece el destino del selector void setSelectorTarget(int value); - // Coloca el selector en una posición específica - void setSelectorPos(Uint8 index); - // Obtiene la anchura del elemento más ancho del menu Uint16 getWidestItem(); diff --git a/source/movingsprite.cpp b/source/movingsprite.cpp index 45aa286..70e4509 100644 --- a/source/movingsprite.cpp +++ b/source/movingsprite.cpp @@ -5,13 +5,35 @@ // Constructor MovingSprite::MovingSprite() { - init(0, 0, 0, 0, 0, 0, 0, 0, nullptr, nullptr); + clear(); } // Destructor MovingSprite::~MovingSprite() { - init(0, 0, 0, 0, 0, 0, 0, 0, nullptr, nullptr); + clear(); +} + +// Reinicia todas las variables +void MovingSprite::clear() +{ + mPosX = 0.0f; // Posición en el eje X + mPosY = 0.0f; // Posición en el eje Y + + mVelX = 0.0f; // Velocidad en el eje X. Cantidad de pixeles a desplazarse + mVelY = 0.0f; // Velocidad en el eje Y. Cantidad de pixeles a desplazarse + + mAccelX = 0.0f; // Aceleración en el eje X. Variación de la velocidad + mAccelY = 0.0f; // Aceleración en el eje Y. Variación de la velocidad + + mZoomW = 1.0f; // Zoom aplicado a la anchura + mZoomH = 1.0f; // Zoom aplicado a la altura + + mAngle = 0.0; // Angulo para dibujarlo + mRotate = false; // Indica si ha de rotar + mRotateSpeed = 0; // Velocidad de giro + mRotateAmount = 0.0; // Cantidad de grados a girar en cada iteración + mCounter = 0; // Contador interno } // Iniciador @@ -40,6 +62,14 @@ void MovingSprite::init(float x, float y, int w, int h, float velx, float vely, // Establece el angulo con el que se dibujará setAngle(0.0); + // Establece los valores de rotacion + setRotate(false); + setRotateSpeed(0); + setRotateAmount(0.0); + + // Contador interno + mCounter = 0; + // Establece la textura donde están los gráficos para el sprite setTexture(texture); @@ -53,18 +83,21 @@ void MovingSprite::init(float x, float y, int w, int h, float velx, float vely, // Mueve el sprite void MovingSprite::move() { - mPosX += mVelX; - mPosY += mVelY; + if (mEnabled) + { + mPosX += mVelX; + mPosY += mVelY; - mVelX += mAccelX; - mVelY += mAccelY; + mVelX += mAccelX; + mVelY += mAccelY; + } } // Muestra el sprite por pantalla void MovingSprite::render() { - //mTexture->render(mRenderer, (int)mPosX, (int)mPosY, &mSpriteClip); - mTexture->render(mRenderer, (int)mPosX, (int)mPosY, &mSpriteClip, mZoomW, mZoomH, mAngle); + if (mEnabled) + mTexture->render(mRenderer, (int)mPosX, (int)mPosY, &mSpriteClip, mZoomW, mZoomH, mAngle); } // Obtiene el valor de la variable @@ -185,4 +218,63 @@ void MovingSprite::incAngle(double inc) void MovingSprite::decAngle(double dec) { mAngle -= dec; +} + +// Obtiene el valor de la variable +bool MovingSprite::getRotate() +{ + return mRotate; +} + +// Obtiene el valor de la variable +Uint16 MovingSprite::getRotateSpeed() +{ + return mRotateSpeed; +} + +// Establece la rotacion +void MovingSprite::rotate() +{ + if (mEnabled) + if (mRotate) + { + if (mCounter % mRotateSpeed == 0) + { + incAngle(mRotateAmount); + } + } +} + +// Establece el valor de la variable +void MovingSprite::setRotate(bool value) +{ + mRotate = value; +} + +// Establece el valor de la variable +void MovingSprite::setRotateSpeed(Uint16 value) +{ + mRotateSpeed = value; +} + +// Establece el valor de la variable +void MovingSprite::setRotateAmount(double value) +{ + mRotateAmount = value; +} + +// Actualiza las variables internas del objeto +void MovingSprite::update() +{ + move(); + rotate(); + + if (mEnabled) + ++mCounter %= 60000; +} + +// Cambia el sentido de la rotación +void MovingSprite::switchRotate() +{ + mRotateAmount *= -1; } \ No newline at end of file diff --git a/source/movingsprite.h b/source/movingsprite.h index 36e0299..c0a9d28 100644 --- a/source/movingsprite.h +++ b/source/movingsprite.h @@ -8,7 +8,7 @@ // Clase MovingSprite. Añade posicion y velocidad en punto flotante class MovingSprite : public Sprite { -private: +protected: float mPosX; // Posición en el eje X float mPosY; // Posición en el eje Y @@ -21,7 +21,11 @@ private: float mZoomW; // Zoom aplicado a la anchura float mZoomH; // Zoom aplicado a la altura - double mAngle; // Angulo para dibujarlo + 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 public: // Constructor @@ -36,6 +40,15 @@ public: // Mueve el sprite void move(); + // Rota el sprite + void rotate(); + + // Actualiza las variables internas del objeto + void update(); + + // Reinicia todas las variables + void clear(); + // Muestra el sprite por pantalla void render(); @@ -66,6 +79,12 @@ public: // Obten el valor de la variable double getAngle(); + // Obtiene el valor de la variable + bool getRotate(); + + // Obtiene el valor de la variable + Uint16 getRotateSpeed(); + // Establece el valor de la variable void setPosX(float x); @@ -98,6 +117,18 @@ public: // Decrementa el valor de la variable void decAngle(double dec); + + // Establece el valor de la variable + void setRotate(bool value); + + // Establece el valor de la variable + void setRotateSpeed(Uint16 value); + + // Establece el valor de la variable + void setRotateAmount(double value); + + // Cambia el sentido de la rotación + void switchRotate(); }; #endif diff --git a/source/smartsprite.cpp b/source/smartsprite.cpp index a5eb314..a5ea765 100644 --- a/source/smartsprite.cpp +++ b/source/smartsprite.cpp @@ -92,24 +92,6 @@ void SmartSprite::setDestY(int value) mDestY = value; } -// Establece el valor de la variable -void SmartSprite::setRotate(bool value) -{ - mRotate = value; -} - -// Establece el valor de la variable -void SmartSprite::setRotateSpeed(Uint16 value) -{ - mRotateSpeed = value; -} - -// Establece el valor de la variable -void SmartSprite::setRotateAmount(double value) -{ - mRotateAmount = value; -} - // Obtiene el valor de la variable int SmartSprite::getDestX() { @@ -122,37 +104,12 @@ int SmartSprite::getDestY() return mDestY; } -// Obtiene el valor de la variable -bool SmartSprite::getRotate() -{ - return mRotate; -} - -// Obtiene el valor de la variable -Uint16 SmartSprite::getRotateSpeed() -{ - return mRotateSpeed; -} - -// Establece la rotacion -void SmartSprite::rotate() -{ - if (mRotate) - { - if (mCounter % mRotateSpeed == 0) - { - incAngle(mRotateAmount); - } - } -} - // Actualiza la posición y comprueba si ha llegado a su destino bool SmartSprite::update() { if (mEnabled) { - move(); - rotate(); + MovingSprite::update(); // Comprueba si se desplaza en el eje X hacia la derecha if ((getAccelX() > 0) || ((getAccelX() == 0) && (getVelX() > 0))) @@ -168,7 +125,6 @@ bool SmartSprite::update() setAccelX(0.0f); } } - // Comprueba si se desplaza en el eje X hacia la izquierda else if ((getAccelX() < 0) || ((getAccelX() == 0) && (getVelX() < 0))) { @@ -244,9 +200,6 @@ bool SmartSprite::update() } } } - - mCounter++; - mCounter %= 65000; } return mIsOnDestination; diff --git a/source/smartsprite.h b/source/smartsprite.h index c1ca798..12463a8 100644 --- a/source/smartsprite.h +++ b/source/smartsprite.h @@ -11,15 +11,11 @@ class SmartSprite : public AnimatedSprite private: bool mEnabled; // Indica si esta habilitado bool mIsOnDestination; // Indica si está en el destino - bool mRotate; // Indica si ha de rotar int mDestX; // Posicion de destino en el eje X int mDestY; // Posicion de destino en el eje Y int mId; // Identificador - Uint16 mCounter; // Contador interno Uint16 mEnabledCounter; // Contador para deshabilitarlo - Uint16 mRotateSpeed; // Velocidad de giro Uint8 *mIntroEvents; // Dirección del array de eventos donde notificar el estado - double mRotateAmount; // Cantidad de grados a girar en cada iteración public: // Constructor @@ -52,30 +48,12 @@ public: // Establece el valor de la variable void setDestY(int value); - // Establece el valor de la variable - void setRotate(bool value); - - // Establece el valor de la variable - void setRotateSpeed(Uint16 value); - - // Establece el valor de la variable - void setRotateAmount(double value); - // Obtiene el valor de la variable int getDestX(); // Obtiene el valor de la variable int getDestY(); - // Obtiene el valor de la variable - bool getRotate(); - - // Obtiene el valor de la variable - Uint16 getRotateSpeed(); - - // Establece la rotacion - void rotate(); - // Actualiza la posición y comprueba si ha llegado a su destino bool update(); diff --git a/source/sprite.cpp b/source/sprite.cpp index dd4344f..a032c51 100644 --- a/source/sprite.cpp +++ b/source/sprite.cpp @@ -32,6 +32,9 @@ void Sprite::init(int x, int y, int w, int h, LTexture *texture, SDL_Renderer *r // Establece el rectangulo de donde coger la imagen setSpriteClip(0, 0, w, h); + + // Habilita el objeto + setEnabled(true); } // Inicializador @@ -58,7 +61,8 @@ void Sprite::init(SDL_Rect rect, LTexture *texture, SDL_Renderer *renderer) // Muestra el sprite por pantalla void Sprite::render() { - mTexture->render(mRenderer, mPosX, mPosY, &mSpriteClip); + if (mEnabled) + mTexture->render(mRenderer, mPosX, mPosY, &mSpriteClip); } // Obten el valor de la variable @@ -146,4 +150,16 @@ void Sprite::setTexture(LTexture *texture) void Sprite::setRenderer(SDL_Renderer *renderer) { mRenderer = renderer; +} + +// Establece el valor de la variable +void Sprite::setEnabled(bool value) +{ + mEnabled = value; +} + +// Comprueba si el objeto está habilitado +bool Sprite::isEnabled() +{ + return mEnabled; } \ No newline at end of file diff --git a/source/sprite.h b/source/sprite.h index 9654ed8..b0d0b3e 100644 --- a/source/sprite.h +++ b/source/sprite.h @@ -8,44 +8,56 @@ // Clase sprite class Sprite { +protected: + int mPosX; // Posición en el eje X donde dibujar el sprite + int mPosY; // Posición en el eje Y donde dibujar el sprite + Uint16 mWidth; // Ancho del sprite + Uint16 mHeight; // Alto del sprite + + SDL_Renderer *mRenderer; // Puntero al renderizador de la ventana + LTexture *mTexture; // Textura donde estan todos los dibujos del sprite + SDL_Rect mSpriteClip; // Rectangulo de origen de la textura que se dibujará en pantalla + + bool mEnabled; // Indica si el sprite esta habilitado + public: - // Constructor - Sprite(); + // Constructor + Sprite(); // Destructor ~Sprite(); - // Inicializador - void init(int x, int y, int w, int h, LTexture *texture, SDL_Renderer *renderer); + // Inicializador + void init(int x, int y, int w, int h, LTexture *texture, SDL_Renderer *renderer); void init(SDL_Rect rect, LTexture *texture, SDL_Renderer *renderer); // Muestra el sprite por pantalla void render(); - + // Obten el valor de la variable int getPosX(); - + // Obten el valor de la variable int getPosY(); - + // Obten el valor de la variable int getWidth(); - + // Obten el valor de la variable int getHeight(); - + // Establece el valor de la variable void setPosX(int x); - + // Establece el valor de la variable void setPosY(int y); - + // Establece el valor de la variable void setWidth(int w); - + // Establece el valor de la variable void setHeight(int h); - + // Obten el valor de la variable SDL_Rect getSpriteClip(); @@ -56,32 +68,19 @@ public: void setSpriteClip(int x, int y, int w, int h); // Obten el valor de la variable - LTexture* getTexture(); + LTexture *getTexture(); // Establece el valor de la variable void setTexture(LTexture *texture); - // Establece el valor de la variable + // Establece el valor de la variable void setRenderer(SDL_Renderer *renderer); + // Establece el valor de la variable + void setEnabled(bool value); -protected: - // Posición X,Y donde dibujar el sprite - int mPosX; - int mPosY; - - // Alto y ancho del sprite - Uint16 mWidth; - Uint16 mHeight; - - // Puntero al renderizador de la ventana - SDL_Renderer *mRenderer; - - // Textura donde estan todos los dibujos del sprite - LTexture *mTexture; - - // Rectangulo de la textura que se dibujará en pantalla - SDL_Rect mSpriteClip; + // Comprueba si el objeto está habilitado + bool isEnabled(); }; #endif