|
|
|
|
@@ -5,18 +5,20 @@
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
// Constructor
|
|
|
|
|
Game::Game(SDL_Renderer *renderer, std::string *filelist, std::string *textStrings, Input *input, bool demo)
|
|
|
|
|
Game::Game(int numPlayers, SDL_Renderer *renderer, std::string *filelist, std::string *textStrings, Input *input1, Input *input2, bool demo)
|
|
|
|
|
{
|
|
|
|
|
// Copia los punteros
|
|
|
|
|
mRenderer = renderer;
|
|
|
|
|
mFileList = filelist;
|
|
|
|
|
mTextStrings = textStrings;
|
|
|
|
|
mInput = input;
|
|
|
|
|
mInput[0] = input1;
|
|
|
|
|
mInput[1] = input2;
|
|
|
|
|
mDemo.enabled = demo;
|
|
|
|
|
mNumPlayers = numPlayers;
|
|
|
|
|
|
|
|
|
|
// Crea los objetos
|
|
|
|
|
mPlayer = new Player();
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < mNumPlayers; i++)
|
|
|
|
|
mPlayer[i] = new Player();
|
|
|
|
|
for (int i = 0; i < MAX_BALLOONS; i++)
|
|
|
|
|
mBalloon[i] = new Balloon();
|
|
|
|
|
for (int i = 0; i < MAX_BULLETS; i++)
|
|
|
|
|
@@ -31,18 +33,22 @@ 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();
|
|
|
|
|
mTexturePlayer1Head = new LTexture();
|
|
|
|
|
mTexturePlayer1Body = new LTexture();
|
|
|
|
|
mTexturePlayer1Death = new LTexture();
|
|
|
|
|
mTexturePlayer1Legs = new LTexture();
|
|
|
|
|
mTexturePlayer2Head = new LTexture();
|
|
|
|
|
mTexturePlayer2Body = new LTexture();
|
|
|
|
|
mTexturePlayer2Death = new LTexture();
|
|
|
|
|
mTexturePlayer2Legs = new LTexture();
|
|
|
|
|
mTextureText = new LTexture();
|
|
|
|
|
mTextureText2 = new LTexture();
|
|
|
|
|
|
|
|
|
|
mText = new Text(mTextureText, mRenderer);
|
|
|
|
|
mTextX2 = new Text(mTextureText2, mRenderer);
|
|
|
|
|
|
|
|
|
|
mMenuGameOver = new Menu(mRenderer, mText, mInput, mFileList);
|
|
|
|
|
mMenuPause = new Menu(mRenderer, mText, mInput, mFileList);
|
|
|
|
|
mMenuGameOver = new Menu(mRenderer, mText, mInput[0], mFileList);
|
|
|
|
|
mMenuPause = new Menu(mRenderer, mText, mInput[0], mFileList);
|
|
|
|
|
|
|
|
|
|
mFade = new Fade(mRenderer);
|
|
|
|
|
mEventHandler = new SDL_Event();
|
|
|
|
|
@@ -78,11 +84,14 @@ Game::~Game()
|
|
|
|
|
{
|
|
|
|
|
mRenderer = nullptr;
|
|
|
|
|
mFileList = nullptr;
|
|
|
|
|
mInput = nullptr;
|
|
|
|
|
|
|
|
|
|
delete mPlayer;
|
|
|
|
|
mPlayer = nullptr;
|
|
|
|
|
mInput[0] = nullptr;
|
|
|
|
|
mInput[1] = nullptr;
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < mNumPlayers; i++)
|
|
|
|
|
{
|
|
|
|
|
delete mPlayer[i];
|
|
|
|
|
mPlayer[i] = nullptr;
|
|
|
|
|
}
|
|
|
|
|
for (int i = 0; i < MAX_BALLOONS; i++)
|
|
|
|
|
{
|
|
|
|
|
delete mBalloon[i];
|
|
|
|
|
@@ -124,21 +133,37 @@ Game::~Game()
|
|
|
|
|
delete mTextureItems;
|
|
|
|
|
mTextureItems = nullptr;
|
|
|
|
|
|
|
|
|
|
mTexturePlayerHead->unload();
|
|
|
|
|
delete mTexturePlayerHead;
|
|
|
|
|
mTexturePlayerHead = nullptr;
|
|
|
|
|
mTexturePlayer1Head->unload();
|
|
|
|
|
delete mTexturePlayer1Head;
|
|
|
|
|
mTexturePlayer1Head = nullptr;
|
|
|
|
|
|
|
|
|
|
mTexturePlayerBody->unload();
|
|
|
|
|
delete mTexturePlayerBody;
|
|
|
|
|
mTexturePlayerBody = nullptr;
|
|
|
|
|
mTexturePlayer1Body->unload();
|
|
|
|
|
delete mTexturePlayer1Body;
|
|
|
|
|
mTexturePlayer1Body = nullptr;
|
|
|
|
|
|
|
|
|
|
mTexturePlayerDeath->unload();
|
|
|
|
|
delete mTexturePlayerDeath;
|
|
|
|
|
mTexturePlayerDeath = nullptr;
|
|
|
|
|
mTexturePlayer1Death->unload();
|
|
|
|
|
delete mTexturePlayer1Death;
|
|
|
|
|
mTexturePlayer1Death = nullptr;
|
|
|
|
|
|
|
|
|
|
mTexturePlayerLegs->unload();
|
|
|
|
|
delete mTexturePlayerLegs;
|
|
|
|
|
mTexturePlayerLegs = nullptr;
|
|
|
|
|
mTexturePlayer1Legs->unload();
|
|
|
|
|
delete mTexturePlayer1Legs;
|
|
|
|
|
mTexturePlayer1Legs = nullptr;
|
|
|
|
|
|
|
|
|
|
mTexturePlayer2Head->unload();
|
|
|
|
|
delete mTexturePlayer2Head;
|
|
|
|
|
mTexturePlayer2Head = nullptr;
|
|
|
|
|
|
|
|
|
|
mTexturePlayer2Body->unload();
|
|
|
|
|
delete mTexturePlayer2Body;
|
|
|
|
|
mTexturePlayer2Body = nullptr;
|
|
|
|
|
|
|
|
|
|
mTexturePlayer2Death->unload();
|
|
|
|
|
delete mTexturePlayer2Death;
|
|
|
|
|
mTexturePlayer2Death = nullptr;
|
|
|
|
|
|
|
|
|
|
mTexturePlayer2Legs->unload();
|
|
|
|
|
delete mTexturePlayer2Legs;
|
|
|
|
|
mTexturePlayer2Legs = nullptr;
|
|
|
|
|
|
|
|
|
|
mTextureText->unload();
|
|
|
|
|
delete mTextureText;
|
|
|
|
|
@@ -368,8 +393,14 @@ void Game::init()
|
|
|
|
|
mSpritePowerMeter->init(PLAY_AREA_CENTER_THIRD_QUARTER_X - 20, HISCORE_NUMBER_Y + 4, 40, 8, mTextureGameBG, mRenderer);
|
|
|
|
|
mSpritePowerMeter->setSpriteClip(256, 192 - 8, 40, 8);
|
|
|
|
|
|
|
|
|
|
// Objeto jugador
|
|
|
|
|
mPlayer->init(PLAY_AREA_CENTER_X - 11, PLAY_AREA_BOTTOM - 24, mTexturePlayerLegs, mTexturePlayerBody, mTexturePlayerHead, mRenderer);
|
|
|
|
|
// Vector de jugadores
|
|
|
|
|
if (mNumPlayers == 1)
|
|
|
|
|
mPlayer[0]->init(PLAY_AREA_CENTER_X - 11, PLAY_AREA_BOTTOM - 24, mTexturePlayer1Legs, mTexturePlayer1Body, mTexturePlayer1Head, mRenderer);
|
|
|
|
|
if (mNumPlayers == 2)
|
|
|
|
|
{
|
|
|
|
|
mPlayer[0]->init((PLAY_AREA_CENTER_FIRST_QUARTER_X * ((0 * 2) + 1)) - 11, PLAY_AREA_BOTTOM - 24, mTexturePlayer1Legs, mTexturePlayer1Body, mTexturePlayer1Head, mRenderer);
|
|
|
|
|
mPlayer[1]->init((PLAY_AREA_CENTER_FIRST_QUARTER_X * ((1 * 2) + 1)) - 11, PLAY_AREA_BOTTOM - 24, mTexturePlayer2Legs, mTexturePlayer2Body, mTexturePlayer2Head, mRenderer);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Establece a cero todos los valores del vector de objetos globo
|
|
|
|
|
resetBalloons();
|
|
|
|
|
@@ -455,10 +486,17 @@ bool Game::loadMedia()
|
|
|
|
|
// Texturas
|
|
|
|
|
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(mTexturePlayer1Legs, mFileList[39], mRenderer);
|
|
|
|
|
success &= loadTextureFromFile(mTexturePlayer1Head, mFileList[41], mRenderer);
|
|
|
|
|
success &= loadTextureFromFile(mTexturePlayer1Body, mFileList[37], mRenderer);
|
|
|
|
|
success &= loadTextureFromFile(mTexturePlayer1Death, mFileList[38], mRenderer);
|
|
|
|
|
|
|
|
|
|
success &= loadTextureFromFile(mTexturePlayer2Legs, mFileList[44], mRenderer);
|
|
|
|
|
success &= loadTextureFromFile(mTexturePlayer2Head, mFileList[45], mRenderer);
|
|
|
|
|
success &= loadTextureFromFile(mTexturePlayer2Body, mFileList[42], mRenderer);
|
|
|
|
|
success &= loadTextureFromFile(mTexturePlayer2Death, mFileList[43], mRenderer);
|
|
|
|
|
|
|
|
|
|
success &= loadTextureFromFile(mTextureBalloon, mFileList[24], mRenderer);
|
|
|
|
|
success &= loadTextureFromFile(mTextureBullet, mFileList[25], mRenderer);
|
|
|
|
|
success &= loadTextureFromFile(mTextureGameBG, mFileList[31], mRenderer);
|
|
|
|
|
@@ -1511,7 +1549,7 @@ void Game::renderScoreBoard()
|
|
|
|
|
color_t color = {0, 0, 0};
|
|
|
|
|
|
|
|
|
|
// Si el jugador esta muerto, no pintes el fondo del marcador, así que pase por encima cuando sale despedido
|
|
|
|
|
if (mPlayer->isAlive())
|
|
|
|
|
if (mPlayer[0]->isAlive())
|
|
|
|
|
mSpriteScoreBoard->render();
|
|
|
|
|
|
|
|
|
|
//if (!mDemo.enabled)
|
|
|
|
|
@@ -1529,9 +1567,9 @@ void Game::renderScoreBoard()
|
|
|
|
|
mText->writeColored(MULTIPLIER_WORD_X, MULTIPLIER_WORD_Y - 6, mTextStrings[41], color);
|
|
|
|
|
|
|
|
|
|
color.g = 192;
|
|
|
|
|
mTextX2->writeShadowed(PLAY_AREA_CENTER_X - 16, SCORE_WORD_Y + 5, std::to_string(mPlayer->getScoreMultiplier()).substr(0, 1), color, 1);
|
|
|
|
|
mTextX2->writeShadowed(PLAY_AREA_CENTER_X - 16, SCORE_WORD_Y + 5, std::to_string(mPlayer[0]->getScoreMultiplier()).substr(0, 1), color, 1);
|
|
|
|
|
mText->writeShadowed(PLAY_AREA_CENTER_X - 2, SCORE_WORD_Y + 12, ".", color);
|
|
|
|
|
mText->writeShadowed(PLAY_AREA_CENTER_X + 4, SCORE_WORD_Y + 12, std::to_string(mPlayer->getScoreMultiplier()).substr(2, 1), color);
|
|
|
|
|
mText->writeShadowed(PLAY_AREA_CENTER_X + 4, SCORE_WORD_Y + 12, std::to_string(mPlayer[0]->getScoreMultiplier()).substr(2, 1), color);
|
|
|
|
|
|
|
|
|
|
// STAGE
|
|
|
|
|
mText->writeCentered(PLAY_AREA_CENTER_FIRST_QUARTER_X, SCORE_NUMBER_Y + 4, mTextStrings[42] + std::to_string(mStage[mCurrentStage].number), 0);
|
|
|
|
|
@@ -1548,17 +1586,20 @@ void Game::renderScoreBoard()
|
|
|
|
|
// Actualiza las variables del jugador
|
|
|
|
|
void Game::updatePlayer()
|
|
|
|
|
{
|
|
|
|
|
mPlayer->update();
|
|
|
|
|
|
|
|
|
|
// Comprueba la colisión entre el jugador y los globos
|
|
|
|
|
if (checkPlayerBalloonCollision())
|
|
|
|
|
for (int i = 0; i < mNumPlayers; i++)
|
|
|
|
|
{
|
|
|
|
|
if (mPlayer->isAlive())
|
|
|
|
|
mPlayer[i]->update();
|
|
|
|
|
|
|
|
|
|
// Comprueba la colisión entre el jugador y los globos
|
|
|
|
|
if (checkPlayerBalloonCollision())
|
|
|
|
|
{
|
|
|
|
|
if (mDemo.enabled)
|
|
|
|
|
mSection = {PROG_SECTION_TITLE, TITLE_SECTION_INSTRUCTIONS};
|
|
|
|
|
else
|
|
|
|
|
killPlayer();
|
|
|
|
|
if (mPlayer[i]->isAlive())
|
|
|
|
|
{
|
|
|
|
|
if (mDemo.enabled)
|
|
|
|
|
mSection = {PROG_SECTION_TITLE, TITLE_SECTION_INSTRUCTIONS};
|
|
|
|
|
else
|
|
|
|
|
killPlayer();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@@ -1601,7 +1642,7 @@ void Game::updateStage()
|
|
|
|
|
// Actualiza el estado de muerte
|
|
|
|
|
void Game::updateDeath()
|
|
|
|
|
{
|
|
|
|
|
if (!mPlayer->isAlive())
|
|
|
|
|
if (!mPlayer[0]->isAlive())
|
|
|
|
|
{
|
|
|
|
|
if (mDeathCounter > 0)
|
|
|
|
|
{
|
|
|
|
|
@@ -1823,8 +1864,8 @@ void Game::updateBalloonSpeed()
|
|
|
|
|
void Game::popBalloon(Uint8 index)
|
|
|
|
|
{
|
|
|
|
|
// Otorga los puntos correspondientes al globo
|
|
|
|
|
mPlayer->addScore(Uint32(mBalloon[index]->getScore() * mPlayer->getScoreMultiplier()));
|
|
|
|
|
setScore(mPlayer->getScore());
|
|
|
|
|
mPlayer[0]->addScore(Uint32(mBalloon[index]->getScore() * mPlayer[0]->getScoreMultiplier()));
|
|
|
|
|
setScore(mPlayer[0]->getScore());
|
|
|
|
|
updateHiScore();
|
|
|
|
|
|
|
|
|
|
// Aumenta el poder de la fase
|
|
|
|
|
@@ -1914,8 +1955,8 @@ void Game::destroyBalloon(Uint8 index)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Otorga los puntos correspondientes al globo
|
|
|
|
|
mPlayer->addScore(Uint32(score * mPlayer->getScoreMultiplier()));
|
|
|
|
|
setScore(mPlayer->getScore());
|
|
|
|
|
mPlayer[0]->addScore(Uint32(score * mPlayer[0]->getScoreMultiplier()));
|
|
|
|
|
setScore(mPlayer[0]->getScore());
|
|
|
|
|
updateHiScore();
|
|
|
|
|
|
|
|
|
|
// Aumenta el poder de la fase
|
|
|
|
|
@@ -1991,10 +2032,11 @@ Uint8 Game::countBalloons()
|
|
|
|
|
// Comprueba la colisión entre el jugador y los globos activos
|
|
|
|
|
bool Game::checkPlayerBalloonCollision()
|
|
|
|
|
{
|
|
|
|
|
for (int i = 0; i < MAX_BALLOONS; i++)
|
|
|
|
|
if ((mBalloon[i]->isEnabled()) && !(mBalloon[i]->isStopped()) && !(mBalloon[i]->isInvulnerable()))
|
|
|
|
|
if (checkCollision(mPlayer->getCollider(), mBalloon[i]->getCollider()))
|
|
|
|
|
return true;
|
|
|
|
|
for (int j = 0; j < mNumPlayers; j++)
|
|
|
|
|
for (int i = 0; i < MAX_BALLOONS; i++)
|
|
|
|
|
if ((mBalloon[i]->isEnabled()) && !(mBalloon[i]->isStopped()) && !(mBalloon[i]->isInvulnerable()))
|
|
|
|
|
if (checkCollision(mPlayer[j]->getCollider(), mBalloon[i]->getCollider()))
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
@@ -2002,57 +2044,59 @@ bool Game::checkPlayerBalloonCollision()
|
|
|
|
|
// Comprueba la colisión entre el jugador y los items
|
|
|
|
|
void Game::checkPlayerItemCollision()
|
|
|
|
|
{
|
|
|
|
|
if (mPlayer->isAlive())
|
|
|
|
|
for (int i = 0; i < MAX_ITEMS; i++)
|
|
|
|
|
{
|
|
|
|
|
if (mItem[i]->isEnabled())
|
|
|
|
|
{
|
|
|
|
|
if (checkCollision(mPlayer->getCollider(), mItem[i]->getCollider()))
|
|
|
|
|
{
|
|
|
|
|
switch (mItem[i]->getClass())
|
|
|
|
|
{
|
|
|
|
|
case ITEM_POINTS_1_DISK:
|
|
|
|
|
mPlayer->addScore(1000);
|
|
|
|
|
setScore(mPlayer->getScore());
|
|
|
|
|
updateHiScore();
|
|
|
|
|
createItemScoreSprite(mItem[i]->getPosX() + (mItem[i]->getWidth() / 2) - (m1000Bitmap->getWidth() / 2), mPlayer->getPosY(), m1000Bitmap);
|
|
|
|
|
JA_PlaySound(mSoundItemPickup);
|
|
|
|
|
break;
|
|
|
|
|
case ITEM_POINTS_2_GAVINA:
|
|
|
|
|
mPlayer->addScore(2500);
|
|
|
|
|
setScore(mPlayer->getScore());
|
|
|
|
|
updateHiScore();
|
|
|
|
|
createItemScoreSprite(mItem[i]->getPosX() + (mItem[i]->getWidth() / 2) - (m2500Bitmap->getWidth() / 2), mPlayer->getPosY(), m2500Bitmap);
|
|
|
|
|
JA_PlaySound(mSoundItemPickup);
|
|
|
|
|
break;
|
|
|
|
|
case ITEM_POINTS_3_PACMAR:
|
|
|
|
|
mPlayer->addScore(5000);
|
|
|
|
|
setScore(mPlayer->getScore());
|
|
|
|
|
updateHiScore();
|
|
|
|
|
createItemScoreSprite(mItem[i]->getPosX() + (mItem[i]->getWidth() / 2) - (m5000Bitmap->getWidth() / 2), mPlayer->getPosY(), m5000Bitmap);
|
|
|
|
|
JA_PlaySound(mSoundItemPickup);
|
|
|
|
|
break;
|
|
|
|
|
case ITEM_CLOCK:
|
|
|
|
|
enableTimeStopItem();
|
|
|
|
|
JA_PlaySound(mSoundItemPickup);
|
|
|
|
|
break;
|
|
|
|
|
case ITEM_COFFEE:
|
|
|
|
|
mPlayer->giveExtraHit();
|
|
|
|
|
JA_PlaySound(mSoundItemPickup);
|
|
|
|
|
break;
|
|
|
|
|
case ITEM_COFFEE_MACHINE:
|
|
|
|
|
mPlayer->setPowerUp(true);
|
|
|
|
|
JA_PlaySound(mSoundItemPickup);
|
|
|
|
|
mCoffeeMachineEnabled = false;
|
|
|
|
|
break;
|
|
|
|
|
for (int j = 0; j < mNumPlayers; j++)
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
if (mPlayer[j]->isAlive())
|
|
|
|
|
for (int i = 0; i < MAX_ITEMS; i++)
|
|
|
|
|
{
|
|
|
|
|
if (mItem[i]->isEnabled())
|
|
|
|
|
{
|
|
|
|
|
if (checkCollision(mPlayer[j]->getCollider(), mItem[i]->getCollider()))
|
|
|
|
|
{
|
|
|
|
|
switch (mItem[i]->getClass())
|
|
|
|
|
{
|
|
|
|
|
case ITEM_POINTS_1_DISK:
|
|
|
|
|
mPlayer[j]->addScore(1000);
|
|
|
|
|
setScore(mPlayer[j]->getScore());
|
|
|
|
|
updateHiScore();
|
|
|
|
|
createItemScoreSprite(mItem[i]->getPosX() + (mItem[i]->getWidth() / 2) - (m1000Bitmap->getWidth() / 2), mPlayer[j]->getPosY(), m1000Bitmap);
|
|
|
|
|
JA_PlaySound(mSoundItemPickup);
|
|
|
|
|
break;
|
|
|
|
|
case ITEM_POINTS_2_GAVINA:
|
|
|
|
|
mPlayer[j]->addScore(2500);
|
|
|
|
|
setScore(mPlayer[j]->getScore());
|
|
|
|
|
updateHiScore();
|
|
|
|
|
createItemScoreSprite(mItem[i]->getPosX() + (mItem[i]->getWidth() / 2) - (m2500Bitmap->getWidth() / 2), mPlayer[j]->getPosY(), m2500Bitmap);
|
|
|
|
|
JA_PlaySound(mSoundItemPickup);
|
|
|
|
|
break;
|
|
|
|
|
case ITEM_POINTS_3_PACMAR:
|
|
|
|
|
mPlayer[j]->addScore(5000);
|
|
|
|
|
setScore(mPlayer[j]->getScore());
|
|
|
|
|
updateHiScore();
|
|
|
|
|
createItemScoreSprite(mItem[i]->getPosX() + (mItem[i]->getWidth() / 2) - (m5000Bitmap->getWidth() / 2), mPlayer[j]->getPosY(), m5000Bitmap);
|
|
|
|
|
JA_PlaySound(mSoundItemPickup);
|
|
|
|
|
break;
|
|
|
|
|
case ITEM_CLOCK:
|
|
|
|
|
enableTimeStopItem();
|
|
|
|
|
JA_PlaySound(mSoundItemPickup);
|
|
|
|
|
break;
|
|
|
|
|
case ITEM_COFFEE:
|
|
|
|
|
mPlayer[j]->giveExtraHit();
|
|
|
|
|
JA_PlaySound(mSoundItemPickup);
|
|
|
|
|
break;
|
|
|
|
|
case ITEM_COFFEE_MACHINE:
|
|
|
|
|
mPlayer[j]->setPowerUp(true);
|
|
|
|
|
JA_PlaySound(mSoundItemPickup);
|
|
|
|
|
mCoffeeMachineEnabled = false;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
mItem[i]->erase();
|
|
|
|
|
}
|
|
|
|
|
mItem[i]->erase();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Comprueba y procesa la colisión entre las balas y los globos
|
|
|
|
|
@@ -2063,7 +2107,7 @@ void Game::checkBulletBalloonCollision()
|
|
|
|
|
if (mBalloon[i]->isEnabled() && (!mBalloon[i]->isInvulnerable()) && mBullet[j]->isActive())
|
|
|
|
|
if (checkCollision(mBalloon[i]->getCollider(), mBullet[j]->getCollider()))
|
|
|
|
|
{
|
|
|
|
|
mPlayer->incScoreMultiplier();
|
|
|
|
|
mPlayer[0]->incScoreMultiplier();
|
|
|
|
|
popBalloon(i);
|
|
|
|
|
if (!mDemo.enabled)
|
|
|
|
|
JA_PlaySound(mSoundBalloon);
|
|
|
|
|
@@ -2088,7 +2132,7 @@ void Game::moveBullets()
|
|
|
|
|
for (int i = 0; i < MAX_BULLETS; i++)
|
|
|
|
|
if (mBullet[i]->isActive())
|
|
|
|
|
if (mBullet[i]->move() == MSG_BULLET_OUT)
|
|
|
|
|
mPlayer->decScoreMultiplier();
|
|
|
|
|
mPlayer[0]->decScoreMultiplier();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Pinta las balas activas
|
|
|
|
|
@@ -2296,7 +2340,7 @@ void Game::throwPlayer(int x, int y)
|
|
|
|
|
const int sentit = ((rand() % 2) ? 1 : -1);
|
|
|
|
|
|
|
|
|
|
mDeathIndex = getSmartSpriteFreeIndex();
|
|
|
|
|
mSmartSprite[mDeathIndex]->init(mTexturePlayerDeath, mRenderer);
|
|
|
|
|
mSmartSprite[mDeathIndex]->init(mTexturePlayer1Death, mRenderer);
|
|
|
|
|
mSmartSprite[mDeathIndex]->setPosX(x);
|
|
|
|
|
mSmartSprite[mDeathIndex]->setPosY(y);
|
|
|
|
|
mSmartSprite[mDeathIndex]->setWidth(24);
|
|
|
|
|
@@ -2346,26 +2390,28 @@ void Game::resetSmartSprites()
|
|
|
|
|
// Acciones a realizar cuando el jugador muere
|
|
|
|
|
void Game::killPlayer()
|
|
|
|
|
{
|
|
|
|
|
if (!mPlayer->isInvulnerable())
|
|
|
|
|
{
|
|
|
|
|
if (mPlayer->hasExtraHit())
|
|
|
|
|
for (int i = 0; i < mNumPlayers; i++)
|
|
|
|
|
|
|
|
|
|
if (!mPlayer[i]->isInvulnerable())
|
|
|
|
|
{
|
|
|
|
|
mPlayer->removeExtraHit();
|
|
|
|
|
throwCoffee(mPlayer->getPosX() + (mPlayer->getWidth() / 2), mPlayer->getPosY() + (mPlayer->getHeight() / 2));
|
|
|
|
|
JA_PlaySound(mSoundCoffeeOut);
|
|
|
|
|
if (mPlayer[i]->hasExtraHit())
|
|
|
|
|
{
|
|
|
|
|
mPlayer[i]->removeExtraHit();
|
|
|
|
|
throwCoffee(mPlayer[i]->getPosX() + (mPlayer[i]->getWidth() / 2), mPlayer[i]->getPosY() + (mPlayer[i]->getHeight() / 2));
|
|
|
|
|
JA_PlaySound(mSoundCoffeeOut);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
stopAllBalloons(10);
|
|
|
|
|
JA_StopMusic();
|
|
|
|
|
JA_PlaySound(mSoundPlayerCollision);
|
|
|
|
|
shakeScreen();
|
|
|
|
|
SDL_Delay(500);
|
|
|
|
|
JA_PlaySound(mSoundCoffeeOut);
|
|
|
|
|
throwPlayer(mPlayer[i]->getPosX(), mPlayer[i]->getPosY());
|
|
|
|
|
mPlayer[i]->setAlive(false);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
stopAllBalloons(10);
|
|
|
|
|
JA_StopMusic();
|
|
|
|
|
JA_PlaySound(mSoundPlayerCollision);
|
|
|
|
|
shakeScreen();
|
|
|
|
|
SDL_Delay(500);
|
|
|
|
|
JA_PlaySound(mSoundCoffeeOut);
|
|
|
|
|
throwPlayer(mPlayer->getPosX(), mPlayer->getPosY());
|
|
|
|
|
mPlayer->setAlive(false);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Calcula y establece el valor de amenaza en funcion de los globos activos
|
|
|
|
|
@@ -2594,8 +2640,9 @@ void Game::renderPlayField()
|
|
|
|
|
renderItems();
|
|
|
|
|
renderSmartSprites();
|
|
|
|
|
renderScoreBoard();
|
|
|
|
|
mPlayer->render();
|
|
|
|
|
if ((mDeathCounter <= 150) && !mPlayer->isAlive())
|
|
|
|
|
for (int i = 0; i < mNumPlayers; i++)
|
|
|
|
|
mPlayer[i]->render();
|
|
|
|
|
if ((mDeathCounter <= 150) && !mPlayer[0]->isAlive())
|
|
|
|
|
renderDeathFade(150 - mDeathCounter);
|
|
|
|
|
if ((mGameCompleted) && (mGameCompletedCounter >= 300))
|
|
|
|
|
renderDeathFade(mGameCompletedCounter - 300);
|
|
|
|
|
@@ -2636,40 +2683,40 @@ void Game::checkGameInput()
|
|
|
|
|
if (mDemo.enabled)
|
|
|
|
|
{
|
|
|
|
|
if (mDemo.dataFile[mDemo.counter].left == 1)
|
|
|
|
|
mPlayer->setInput(INPUT_LEFT);
|
|
|
|
|
mPlayer[0]->setInput(INPUT_LEFT);
|
|
|
|
|
|
|
|
|
|
if (mDemo.dataFile[mDemo.counter].right == 1)
|
|
|
|
|
mPlayer->setInput(INPUT_RIGHT);
|
|
|
|
|
mPlayer[0]->setInput(INPUT_RIGHT);
|
|
|
|
|
|
|
|
|
|
if (mDemo.dataFile[mDemo.counter].noInput == 1)
|
|
|
|
|
mPlayer->setInput(NO_INPUT);
|
|
|
|
|
mPlayer[0]->setInput(NO_INPUT);
|
|
|
|
|
|
|
|
|
|
if (mDemo.dataFile[mDemo.counter].fire == 1)
|
|
|
|
|
if (mPlayer->canFire())
|
|
|
|
|
if (mPlayer[0]->canFire())
|
|
|
|
|
{
|
|
|
|
|
mPlayer->setInput(INPUT_FIRE_UP);
|
|
|
|
|
createBullet(mPlayer->getPosX() + (mPlayer->getWidth() / 2) - 4, mPlayer->getPosY() + (mPlayer->getHeight() / 2), BULLET_UP, mPlayer->isPowerUp());
|
|
|
|
|
mPlayer->setFireCooldown(10);
|
|
|
|
|
mPlayer[0]->setInput(INPUT_FIRE_UP);
|
|
|
|
|
createBullet(mPlayer[0]->getPosX() + (mPlayer[0]->getWidth() / 2) - 4, mPlayer[0]->getPosY() + (mPlayer[0]->getHeight() / 2), BULLET_UP, mPlayer[0]->isPowerUp());
|
|
|
|
|
mPlayer[0]->setFireCooldown(10);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mDemo.dataFile[mDemo.counter].fireLeft == 1)
|
|
|
|
|
if (mPlayer->canFire())
|
|
|
|
|
if (mPlayer[0]->canFire())
|
|
|
|
|
{
|
|
|
|
|
mPlayer->setInput(INPUT_FIRE_LEFT);
|
|
|
|
|
createBullet(mPlayer->getPosX() + (mPlayer->getWidth() / 2) - 4, mPlayer->getPosY() + (mPlayer->getHeight() / 2), BULLET_UP, mPlayer->isPowerUp());
|
|
|
|
|
mPlayer->setFireCooldown(10);
|
|
|
|
|
mPlayer[0]->setInput(INPUT_FIRE_LEFT);
|
|
|
|
|
createBullet(mPlayer[0]->getPosX() + (mPlayer[0]->getWidth() / 2) - 4, mPlayer[0]->getPosY() + (mPlayer[0]->getHeight() / 2), BULLET_UP, mPlayer[0]->isPowerUp());
|
|
|
|
|
mPlayer[0]->setFireCooldown(10);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mDemo.dataFile[mDemo.counter].fireRight == 1)
|
|
|
|
|
if (mPlayer->canFire())
|
|
|
|
|
if (mPlayer[0]->canFire())
|
|
|
|
|
{
|
|
|
|
|
mPlayer->setInput(INPUT_FIRE_RIGHT);
|
|
|
|
|
createBullet(mPlayer->getPosX() + (mPlayer->getWidth() / 2) - 4, mPlayer->getPosY() + (mPlayer->getHeight() / 2), BULLET_UP, mPlayer->isPowerUp());
|
|
|
|
|
mPlayer->setFireCooldown(10);
|
|
|
|
|
mPlayer[0]->setInput(INPUT_FIRE_RIGHT);
|
|
|
|
|
createBullet(mPlayer[0]->getPosX() + (mPlayer[0]->getWidth() / 2) - 4, mPlayer[0]->getPosY() + (mPlayer[0]->getHeight() / 2), BULLET_UP, mPlayer[0]->isPowerUp());
|
|
|
|
|
mPlayer[0]->setFireCooldown(10);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Comprueba el input de pausa
|
|
|
|
|
if (mInput->checkInput(INPUT_PAUSE, REPEAT_FALSE))
|
|
|
|
|
if (mInput[0]->checkInput(INPUT_PAUSE, REPEAT_FALSE))
|
|
|
|
|
mSection.name = PROG_SECTION_TITLE;
|
|
|
|
|
|
|
|
|
|
// Incrementa el contador de la demo
|
|
|
|
|
@@ -2679,97 +2726,99 @@ void Game::checkGameInput()
|
|
|
|
|
mSection = {PROG_SECTION_TITLE, TITLE_SECTION_INSTRUCTIONS};
|
|
|
|
|
}
|
|
|
|
|
// Modo Demo no activo
|
|
|
|
|
else if (mPlayer->isAlive())
|
|
|
|
|
{
|
|
|
|
|
// Input a la izquierda
|
|
|
|
|
if (mInput->checkInput(INPUT_LEFT, REPEAT_TRUE))
|
|
|
|
|
{
|
|
|
|
|
mPlayer->setInput(INPUT_LEFT);
|
|
|
|
|
mDemo.keys.left = 1;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
// Input a la derecha
|
|
|
|
|
if (mInput->checkInput(INPUT_RIGHT, REPEAT_TRUE))
|
|
|
|
|
else
|
|
|
|
|
for (int i = 0; i < mNumPlayers; i++)
|
|
|
|
|
if (mPlayer[i]->isAlive())
|
|
|
|
|
{
|
|
|
|
|
mPlayer->setInput(INPUT_RIGHT);
|
|
|
|
|
mDemo.keys.right = 1;
|
|
|
|
|
// Input a la izquierda
|
|
|
|
|
if (mInput[i]->checkInput(INPUT_LEFT, REPEAT_TRUE))
|
|
|
|
|
{
|
|
|
|
|
mPlayer[i]->setInput(INPUT_LEFT);
|
|
|
|
|
mDemo.keys.left = 1;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
// Input a la derecha
|
|
|
|
|
if (mInput[i]->checkInput(INPUT_RIGHT, REPEAT_TRUE))
|
|
|
|
|
{
|
|
|
|
|
mPlayer[i]->setInput(INPUT_RIGHT);
|
|
|
|
|
mDemo.keys.right = 1;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
// Ninguno de los dos inputs anteriores
|
|
|
|
|
mPlayer[i]->setInput(NO_INPUT);
|
|
|
|
|
mDemo.keys.noInput = 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// Comprueba el input de disparar al centro
|
|
|
|
|
if (mInput[i]->checkInput(INPUT_BUTTON_2, REPEAT_TRUE))
|
|
|
|
|
{
|
|
|
|
|
if (mPlayer[i]->canFire())
|
|
|
|
|
{
|
|
|
|
|
mPlayer[i]->setInput(INPUT_FIRE_UP);
|
|
|
|
|
createBullet(mPlayer[i]->getPosX() + (mPlayer[i]->getWidth() / 2) - 4, mPlayer[i]->getPosY() + (mPlayer[i]->getHeight() / 2), BULLET_UP, mPlayer[i]->isPowerUp());
|
|
|
|
|
mPlayer[i]->setFireCooldown(10);
|
|
|
|
|
|
|
|
|
|
// Reproduce el sonido de disparo
|
|
|
|
|
JA_PlaySound(mSoundBullet);
|
|
|
|
|
|
|
|
|
|
mDemo.keys.fire = 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Comprueba el input de disparar a la izquierda
|
|
|
|
|
if (mInput[i]->checkInput(INPUT_BUTTON_1, REPEAT_TRUE))
|
|
|
|
|
{
|
|
|
|
|
if (mPlayer[i]->canFire())
|
|
|
|
|
{
|
|
|
|
|
mPlayer[i]->setInput(INPUT_FIRE_LEFT);
|
|
|
|
|
createBullet(mPlayer[i]->getPosX() + (mPlayer[i]->getWidth() / 2) - 4, mPlayer[i]->getPosY() + (mPlayer[i]->getHeight() / 2), BULLET_LEFT, mPlayer[i]->isPowerUp());
|
|
|
|
|
mPlayer[i]->setFireCooldown(10);
|
|
|
|
|
|
|
|
|
|
// Reproduce el sonido de disparo
|
|
|
|
|
JA_PlaySound(mSoundBullet);
|
|
|
|
|
|
|
|
|
|
mDemo.keys.fireLeft = 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Comprueba el input de disparar a la derecha
|
|
|
|
|
if (mInput[i]->checkInput(INPUT_BUTTON_3, REPEAT_TRUE))
|
|
|
|
|
{
|
|
|
|
|
if (mPlayer[i]->canFire())
|
|
|
|
|
{
|
|
|
|
|
mPlayer[i]->setInput(INPUT_FIRE_RIGHT);
|
|
|
|
|
createBullet(mPlayer[i]->getPosX() + (mPlayer[i]->getWidth() / 2) - 4, mPlayer[i]->getPosY() + (mPlayer[i]->getHeight() / 2), BULLET_RIGHT, mPlayer[i]->isPowerUp());
|
|
|
|
|
mPlayer[i]->setFireCooldown(10);
|
|
|
|
|
|
|
|
|
|
// Reproduce el sonido de disparo
|
|
|
|
|
JA_PlaySound(mSoundBullet);
|
|
|
|
|
|
|
|
|
|
mDemo.keys.fireRight = 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Comprueba el input de pausa
|
|
|
|
|
if (mInput[i]->checkInput(INPUT_CANCEL, REPEAT_FALSE))
|
|
|
|
|
{
|
|
|
|
|
mSection.subsection = GAME_SECTION_PAUSE;
|
|
|
|
|
|
|
|
|
|
if (JA_GetMusicState() == JA_MUSIC_PLAYING)
|
|
|
|
|
JA_PauseMusic();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mDemo.counter < TOTAL_DEMO_DATA)
|
|
|
|
|
{
|
|
|
|
|
if (mDemo.recording)
|
|
|
|
|
mDemo.dataFile[mDemo.counter] = mDemo.keys;
|
|
|
|
|
mDemo.counter++;
|
|
|
|
|
}
|
|
|
|
|
else if (mDemo.recording)
|
|
|
|
|
{
|
|
|
|
|
mSection.name = PROG_SECTION_QUIT;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
// Ninguno de los dos inputs anteriores
|
|
|
|
|
mPlayer->setInput(NO_INPUT);
|
|
|
|
|
mDemo.keys.noInput = 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// Comprueba el input de disparar al centro
|
|
|
|
|
if (mInput->checkInput(INPUT_BUTTON_2, REPEAT_TRUE))
|
|
|
|
|
{
|
|
|
|
|
if (mPlayer->canFire())
|
|
|
|
|
{
|
|
|
|
|
mPlayer->setInput(INPUT_FIRE_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
|
|
|
|
|
JA_PlaySound(mSoundBullet);
|
|
|
|
|
|
|
|
|
|
mDemo.keys.fire = 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 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, mPlayer->isPowerUp());
|
|
|
|
|
mPlayer->setFireCooldown(10);
|
|
|
|
|
|
|
|
|
|
// Reproduce el sonido de disparo
|
|
|
|
|
JA_PlaySound(mSoundBullet);
|
|
|
|
|
|
|
|
|
|
mDemo.keys.fireLeft = 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Comprueba el input de disparar a la derecha
|
|
|
|
|
if (mInput->checkInput(INPUT_BUTTON_3, REPEAT_TRUE))
|
|
|
|
|
{
|
|
|
|
|
if (mPlayer->canFire())
|
|
|
|
|
{
|
|
|
|
|
mPlayer->setInput(INPUT_FIRE_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
|
|
|
|
|
JA_PlaySound(mSoundBullet);
|
|
|
|
|
|
|
|
|
|
mDemo.keys.fireRight = 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Comprueba el input de pausa
|
|
|
|
|
if (mInput->checkInput(INPUT_CANCEL, REPEAT_FALSE))
|
|
|
|
|
{
|
|
|
|
|
mSection.subsection = GAME_SECTION_PAUSE;
|
|
|
|
|
|
|
|
|
|
if (JA_GetMusicState() == JA_MUSIC_PLAYING)
|
|
|
|
|
JA_PauseMusic();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mDemo.counter < TOTAL_DEMO_DATA)
|
|
|
|
|
{
|
|
|
|
|
if (mDemo.recording)
|
|
|
|
|
mDemo.dataFile[mDemo.counter] = mDemo.keys;
|
|
|
|
|
mDemo.counter++;
|
|
|
|
|
}
|
|
|
|
|
else if (mDemo.recording)
|
|
|
|
|
{
|
|
|
|
|
mSection.name = PROG_SECTION_QUIT;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Pinta diferentes mensajes en la pantalla
|
|
|
|
|
@@ -2864,7 +2913,8 @@ void Game::shakeScreen()
|
|
|
|
|
renderBalloons();
|
|
|
|
|
renderBullets();
|
|
|
|
|
renderItems();
|
|
|
|
|
mPlayer->render();
|
|
|
|
|
for (int i = 0; i < mNumPlayers; i++)
|
|
|
|
|
mPlayer[i]->render();
|
|
|
|
|
renderScoreBoard();
|
|
|
|
|
|
|
|
|
|
// Actualiza la pantalla
|
|
|
|
|
@@ -2896,7 +2946,7 @@ section_t Game::run()
|
|
|
|
|
{
|
|
|
|
|
// Reproduce la música
|
|
|
|
|
if (!mGameCompleted)
|
|
|
|
|
if (mPlayer->isAlive())
|
|
|
|
|
if (mPlayer[0]->isAlive())
|
|
|
|
|
JA_PlayMusic(mMusicPlaying);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -2959,8 +3009,8 @@ section_t Game::run()
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case SDL_SCANCODE_I:
|
|
|
|
|
mPlayer->setInvulnerable(true);
|
|
|
|
|
mPlayer->setInvulnerableCounter(65000);
|
|
|
|
|
mPlayer[0]->setInvulnerable(true);
|
|
|
|
|
mPlayer[0]->setInvulnerableCounter(65000);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case SDL_SCANCODE_M:
|
|
|
|
|
@@ -3039,7 +3089,8 @@ void Game::runPausedGame()
|
|
|
|
|
renderBackground();
|
|
|
|
|
renderBalloons();
|
|
|
|
|
renderBullets();
|
|
|
|
|
mPlayer->render();
|
|
|
|
|
for (int i = 0; i < mNumPlayers; i++)
|
|
|
|
|
mPlayer[i]->render();
|
|
|
|
|
renderScoreBoard();
|
|
|
|
|
mMenuPause->render();
|
|
|
|
|
mFade->render();
|
|
|
|
|
@@ -3130,7 +3181,7 @@ void Game::runGameOverScreen()
|
|
|
|
|
|
|
|
|
|
// Dibuja los objetos
|
|
|
|
|
mTextX2->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y - (BLOCK * 4), mTextStrings[43], 0);
|
|
|
|
|
mText->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y - (BLOCK * 1), mTextStrings[44] + std::to_string(mPlayer->getScore()), 0);
|
|
|
|
|
mText->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y - (BLOCK * 1), mTextStrings[44] + std::to_string(mPlayer[0]->getScore()), 0);
|
|
|
|
|
mText->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y + BLOCK * 2, mTextStrings[45], 0);
|
|
|
|
|
mMenuGameOver->render();
|
|
|
|
|
mFade->render();
|
|
|
|
|
@@ -3175,7 +3226,7 @@ void Game::renderDebugInfo()
|
|
|
|
|
mText->writeShadowed(2, 2 + 3 * BLOCK, "mCounter: " + std::to_string(mCounter), color);
|
|
|
|
|
mText->writeShadowed(2, 2 + 4 * BLOCK, "(R)enemyset: " + std::to_string(mDebug.enemySet), color);
|
|
|
|
|
mText->writeShadowed(2, 2 + 5 * BLOCK, "RGB: " + std::to_string(mDebug.gradR) + "," + std::to_string(mDebug.gradG) + "," + std::to_string(mDebug.gradB), color);
|
|
|
|
|
mText->writeShadowed(2, 2 + 6 * BLOCK, "(I)invuln: " + std::to_string(mPlayer->getInvulnerableCounter()), color);
|
|
|
|
|
mText->writeShadowed(2, 2 + 6 * BLOCK, "(I)invuln: " + std::to_string(mPlayer[0]->getInvulnerableCounter()), color);
|
|
|
|
|
mText->writeShadowed(2, 2 + 7 * BLOCK, "balloons: " + std::to_string(countBalloons()), color);
|
|
|
|
|
mText->writeShadowed(2, 2 + 8 * BLOCK, "balloonsPop: " + std::to_string(mBalloonsPopped), color);
|
|
|
|
|
mText->writeShadowed(2, 2 + 9 * BLOCK, "(Z-X)ballSped:" + std::to_string(mEnemySpeed), color);
|
|
|
|
|
@@ -3268,12 +3319,12 @@ void Game::updateHelper()
|
|
|
|
|
// Solo ofrece ayuda cuando la amenaza o la velocidad es elevada
|
|
|
|
|
if (mMenaceCurrent > 15)
|
|
|
|
|
{
|
|
|
|
|
if (mPlayer->getCoffees() == 0)
|
|
|
|
|
if (mPlayer[0]->getCoffees() == 0)
|
|
|
|
|
mHelper.needCoffee = true;
|
|
|
|
|
else
|
|
|
|
|
mHelper.needCoffee = false;
|
|
|
|
|
|
|
|
|
|
if (!mPlayer->isPowerUp())
|
|
|
|
|
if (!mPlayer[0]->isPowerUp())
|
|
|
|
|
mHelper.needCoffeeMachine = true;
|
|
|
|
|
else
|
|
|
|
|
mHelper.needCoffeeMachine = false;
|
|
|
|
|
|