working on 2p

This commit is contained in:
2021-08-24 13:01:33 +02:00
parent 52ea512eab
commit b61fd84e22
8 changed files with 199 additions and 147 deletions

View File

@@ -274,10 +274,11 @@ void Game::init()
mGameCompleted = false;
mGameCompletedCounter = 0;
mSection.name = PROG_SECTION_GAME;
mSection.subsection = GAME_SECTION_PLAY;
mSection.subsection = GAME_SECTION_PLAY_1P;
mMenaceCurrent = 0;
mMenaceThreshold = 0;
mScore = 0;
//mScore = 0;
mHiScore = 0;
mHiScoreAchieved = false;
mCurrentStage = 0;
mStageBitmapCounter = STAGE_COUNTER;
@@ -395,11 +396,11 @@ void Game::init()
// Vector de jugadores
if (mNumPlayers == 1)
mPlayer[0]->init(PLAY_AREA_CENTER_X - 11, PLAY_AREA_BOTTOM - 24, mTexturePlayer1Legs, mTexturePlayer1Body, mTexturePlayer1Head, mRenderer);
mPlayer[0]->init(PLAY_AREA_CENTER_X - 11, PLAY_AREA_BOTTOM - 24, mTexturePlayer1Legs, mTexturePlayer1Body, mTexturePlayer1Head, mTexturePlayer1Death, 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);
mPlayer[0]->init((PLAY_AREA_CENTER_FIRST_QUARTER_X * ((0 * 2) + 1)) - 11, PLAY_AREA_BOTTOM - 24, mTexturePlayer1Legs, mTexturePlayer1Body, mTexturePlayer1Head, mTexturePlayer1Death, mRenderer);
mPlayer[1]->init((PLAY_AREA_CENTER_FIRST_QUARTER_X * ((1 * 2) + 1)) - 11, PLAY_AREA_BOTTOM - 24, mTexturePlayer2Legs, mTexturePlayer2Body, mTexturePlayer2Head, mTexturePlayer2Death, mRenderer);
}
// Establece a cero todos los valores del vector de objetos globo
@@ -1467,10 +1468,10 @@ void Game::increaseStageCurrentPower(Uint8 power)
}
// Establece el valor de la variable
void Game::setScore(Uint32 score)
/*void Game::setScore(Uint32 score)
{
mScore = score;
}
}*/
// Establece el valor de la variable
void Game::setHiScore(Uint32 score)
@@ -1481,23 +1482,24 @@ void Game::setHiScore(Uint32 score)
// Actualiza el valor de mHiScore en caso necesario
void Game::updateHiScore()
{
// La puntuación es mayor que la máxima puntuación
if (mScore > mHiScore)
{
// Actualiza la máxima puntuación
mHiScore = mScore;
// Almacena la máxima puntuación en el fichero junto con un checksum
mScoreDataFile[0] = mHiScore;
mScoreDataFile[1] = mHiScore % 43;
// Si superamos la máxima puntuación
if (mHiScoreAchieved == false)
// Si la puntuación actual es mayor que la máxima puntuación
for (int i = 0; i < mNumPlayers; i++)
if (mPlayer[i]->getScore() > mHiScore)
{
mHiScoreAchieved = true;
JA_PlaySound(mSoundHiScore);
// Actualiza la máxima puntuación
mHiScore = mPlayer[i]->getScore();
// Almacena la máxima puntuación en el fichero junto con un checksum
mScoreDataFile[0] = mHiScore;
mScoreDataFile[1] = mHiScore % 43;
// Si se supera la máxima puntuación emite sonido
if (mHiScoreAchieved == false)
{
mHiScoreAchieved = true;
JA_PlaySound(mSoundHiScore);
}
}
}
}
// Transforma un valor numérico en una cadena de 6 cifras
@@ -1554,7 +1556,7 @@ void Game::renderScoreBoard()
// SCORE
mText->writeCentered(PLAY_AREA_CENTER_FIRST_QUARTER_X, SCORE_WORD_Y - 6, mTextStrings[39], 0);
mText->writeCentered(PLAY_AREA_CENTER_FIRST_QUARTER_X, SCORE_NUMBER_Y - 6, updateScoreText(mScore), 0);
mText->writeCentered(PLAY_AREA_CENTER_FIRST_QUARTER_X, SCORE_NUMBER_Y - 6, updateScoreText(mPlayer[0]->getScore()), 0);
// HI-SCORE
mText->writeCentered(PLAY_AREA_CENTER_THIRD_QUARTER_X, HISCORE_WORD_Y - 6, mTextStrings[40], 0);
@@ -1588,16 +1590,19 @@ void Game::updatePlayer()
mPlayer[i]->update();
// Comprueba la colisión entre el jugador y los globos
if (checkPlayerBalloonCollision())
if (checkPlayerBalloonCollision(i))
{
if (mPlayer[i]->isAlive())
{
if (mDemo.enabled)
mSection = {PROG_SECTION_TITLE, TITLE_SECTION_INSTRUCTIONS};
else
killPlayer();
killPlayer(i);
}
}
// Comprueba las colisiones entre el jugador y los items
checkPlayerItemCollision(i);
}
}
@@ -1639,7 +1644,12 @@ void Game::updateStage()
// Actualiza el estado de muerte
void Game::updateDeath()
{
if (!mPlayer[0]->isAlive())
// Comprueba si todos los jugadores estan muertos
bool allPlayersAreDead = true;
for (int i = 0; i < mNumPlayers; i++)
allPlayersAreDead &= (!mPlayer[i]->isAlive());
if (allPlayersAreDead)
{
if (mDeathCounter > 0)
{
@@ -1948,7 +1958,7 @@ void Game::destroyBalloon(Uint8 index)
// Otorga los puntos correspondientes al globo
mPlayer[0]->addScore(Uint32(score * mPlayer[0]->getScoreMultiplier()));
setScore(mPlayer[0]->getScore());
//setScore(mPlayer[0]->getScore());
updateHiScore();
// Aumenta el poder de la fase
@@ -2022,73 +2032,70 @@ Uint8 Game::countBalloons()
}
// Comprueba la colisión entre el jugador y los globos activos
bool Game::checkPlayerBalloonCollision()
bool Game::checkPlayerBalloonCollision(int index)
{
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;
for (int i = 0; i < MAX_BALLOONS; i++)
if ((mBalloon[i]->isEnabled()) && !(mBalloon[i]->isStopped()) && !(mBalloon[i]->isInvulnerable()))
if (checkCollision(mPlayer[index]->getCollider(), mBalloon[i]->getCollider()))
return true;
return false;
}
// Comprueba la colisión entre el jugador y los items
void Game::checkPlayerItemCollision()
void Game::checkPlayerItemCollision(int index)
{
for (int j = 0; j < mNumPlayers; j++)
if (mPlayer[j]->isAlive())
for (int i = 0; i < MAX_ITEMS; i++)
if (mPlayer[index]->isAlive())
for (int i = 0; i < MAX_ITEMS; i++)
{
if (mItem[i]->isEnabled())
{
if (mItem[i]->isEnabled())
if (checkCollision(mPlayer[index]->getCollider(), mItem[i]->getCollider()))
{
if (checkCollision(mPlayer[j]->getCollider(), mItem[i]->getCollider()))
switch (mItem[i]->getClass())
{
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;
case ITEM_POINTS_1_DISK:
mPlayer[index]->addScore(1000);
//setScore(mPlayer[index]->getScore());
updateHiScore();
createItemScoreSprite(mItem[i]->getPosX() + (mItem[i]->getWidth() / 2) - (m1000Bitmap->getWidth() / 2), mPlayer[index]->getPosY(), m1000Bitmap);
JA_PlaySound(mSoundItemPickup);
break;
case ITEM_POINTS_2_GAVINA:
mPlayer[index]->addScore(2500);
//setScore(mPlayer[index]->getScore());
updateHiScore();
createItemScoreSprite(mItem[i]->getPosX() + (mItem[i]->getWidth() / 2) - (m2500Bitmap->getWidth() / 2), mPlayer[index]->getPosY(), m2500Bitmap);
JA_PlaySound(mSoundItemPickup);
break;
case ITEM_POINTS_3_PACMAR:
mPlayer[index]->addScore(5000);
//setScore(mPlayer[index]->getScore());
updateHiScore();
createItemScoreSprite(mItem[i]->getPosX() + (mItem[i]->getWidth() / 2) - (m5000Bitmap->getWidth() / 2), mPlayer[index]->getPosY(), m5000Bitmap);
JA_PlaySound(mSoundItemPickup);
break;
case ITEM_CLOCK:
enableTimeStopItem();
JA_PlaySound(mSoundItemPickup);
break;
case ITEM_COFFEE:
mPlayer[index]->giveExtraHit();
JA_PlaySound(mSoundItemPickup);
break;
case ITEM_COFFEE_MACHINE:
mPlayer[index]->setPowerUp(true);
JA_PlaySound(mSoundItemPickup);
mCoffeeMachineEnabled = false;
break;
default:
break;
}
mItem[i]->erase();
default:
break;
}
mItem[i]->erase();
}
}
}
}
// Comprueba y procesa la colisión entre las balas y los globos
@@ -2103,7 +2110,7 @@ void Game::checkBulletBalloonCollision()
const int index = mBullet[j]->getOwner();
mPlayer[index]->incScoreMultiplier();
mPlayer[index]->addScore(Uint32(mBalloon[i]->getScore() * mPlayer[index]->getScoreMultiplier()));
setScore(mPlayer[index]->getScore());
//setScore(mPlayer[index]->getScore());
updateHiScore();
// Explota el globo
@@ -2339,12 +2346,16 @@ void Game::throwCoffee(int x, int y)
}
// Crea un SmartSprite para arrojar al jugador al morir
void Game::throwPlayer(int x, int y)
void Game::throwPlayer(int x, int y, int index)
{
const int sentit = ((rand() % 2) ? 1 : -1);
mDeathIndex = getSmartSpriteFreeIndex();
mSmartSprite[mDeathIndex]->init(mTexturePlayer1Death, mRenderer);
/*if (index == 1)
mSmartSprite[mDeathIndex]->init(mTexturePlayer1Death, mRenderer);
if (index == 2)
mSmartSprite[mDeathIndex]->init(mTexturePlayer2Death, mRenderer);*/
mSmartSprite[mDeathIndex]->init(mPlayer[index]->getDeadTexture(), mRenderer);
mSmartSprite[mDeathIndex]->setPosX(x);
mSmartSprite[mDeathIndex]->setPosY(y);
mSmartSprite[mDeathIndex]->setWidth(24);
@@ -2392,30 +2403,28 @@ void Game::resetSmartSprites()
}
// Acciones a realizar cuando el jugador muere
void Game::killPlayer()
void Game::killPlayer(int index)
{
for (int i = 0; i < mNumPlayers; i++)
if (!mPlayer[i]->isInvulnerable())
if (!mPlayer[index]->isInvulnerable())
{
if (mPlayer[index]->hasExtraHit())
{
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);
}
mPlayer[index]->removeExtraHit();
throwCoffee(mPlayer[index]->getPosX() + (mPlayer[index]->getWidth() / 2), mPlayer[index]->getPosY() + (mPlayer[index]->getHeight() / 2));
JA_PlaySound(mSoundCoffeeOut);
}
else
{
stopAllBalloons(10);
JA_StopMusic();
JA_PlaySound(mSoundPlayerCollision);
shakeScreen();
SDL_Delay(500);
JA_PlaySound(mSoundCoffeeOut);
throwPlayer(mPlayer[index]->getPosX(), mPlayer[index]->getPosY(), index);
mPlayer[index]->setAlive(false);
}
}
}
// Calcula y establece el valor de amenaza en funcion de los globos activos
@@ -2565,9 +2574,6 @@ void Game::updatePlayField()
// Comprueba las colisiones entre globos y balas
checkBulletBalloonCollision();
// Comprueba las colisiones entre el jugador y los items
checkPlayerItemCollision();
// Comprueba el nivel de amenaza para ver si se han de crear nuevos enemigos
if (!mGameCompleted)
updateMenace();
@@ -2944,7 +2950,7 @@ section_t Game::run()
runGameOverScreen();
// Sección juego jugando
if (mSection.subsection == GAME_SECTION_PLAY)
if ((mSection.subsection == GAME_SECTION_PLAY_1P) || (mSection.subsection == GAME_SECTION_PLAY_2P))
{
// Si la música no está sonando
if ((JA_GetMusicState() == JA_MUSIC_INVALID) || (JA_GetMusicState() == JA_MUSIC_STOPPED))
@@ -3112,7 +3118,10 @@ void Game::runPausedGame()
case 0:
//mMenuPause->reset();
mSection.name = PROG_SECTION_GAME;
mSection.subsection = GAME_SECTION_PLAY;
if (mNumPlayers == 1)
mSection.subsection = GAME_SECTION_PLAY_1P;
else
mSection.subsection = GAME_SECTION_PLAY_2P;
if (JA_GetMusicState() == JA_MUSIC_PAUSED)
JA_ResumeMusic();
break;
@@ -3163,7 +3172,10 @@ void Game::runGameOverScreen()
{
case 0: // YES
mSection.name = PROG_SECTION_GAME;
mSection.subsection = GAME_SECTION_PLAY;
if (mNumPlayers == 1)
mSection.subsection = GAME_SECTION_PLAY_1P;
else
mSection.subsection = GAME_SECTION_PLAY_2P;
init();
break;