Resueltos los dos últimos problemas

This commit is contained in:
2022-10-03 17:14:33 +02:00
parent 99b61c4b2d
commit 95d6396dfa
7 changed files with 204 additions and 129 deletions

View File

@@ -2462,6 +2462,22 @@ void Game::createItemScoreSprite(int x, int y, SmartSprite *sprite)
ss->setEnabledCounter(100);
}
// Vacia el vector de smartsprites
void Game::freeSmartSprites()
{
if (smartSprites.empty() == false)
{
for (int i = smartSprites.size() - 1; i >= 0; --i)
{
if (smartSprites.at(i)->hasFinished())
{
delete smartSprites.at(i);
smartSprites.erase(smartSprites.begin() + i);
}
}
}
}
// Dibuja el efecto de flash
void Game::renderFlashEffect()
{
@@ -2662,63 +2678,77 @@ void Game::updateEnemyDeployCounter()
}
}
// Actualiza el campo de juego
void Game::updatePlayField()
// Actualiza el juego
void Game::update()
{
// Comprueba el teclado/mando
checkGameInput();
// Comprueba los eventos que hay en cola
checkEventHandler();
// Actualiza las variables del jugador
updatePlayer();
// Actualiza el fondo
updateBackground();
// Mueve los globos
updateBalloons();
// Mueve las balas
moveBullets();
// Actualiza los items
updateItems();
// Actualiza el valor de mCurrentStage
updateStage();
// Actualiza el estado de muerte
updateDeath();
// Actualiza los SmartSprites
updateSmartSprites();
// Actualiza los contadores de estado y efectos
updateTimeStoppedCounter();
updateEnemyDeployCounter();
updateShakeEffect();
// Actualiza el ayudante
updateHelper();
// Comprueba las colisiones entre globos y balas
checkBulletBalloonCollision();
// Comprueba el nivel de amenaza para ver si se han de crear nuevos enemigos
if (!mGameCompleted)
// Comprueba que la diferencia de ticks sea mayor a la velocidad del juego
if (SDL_GetTicks() - mTicks > mTicksSpeed)
{
updateMenace();
// Actualiza el contador de ticks
mTicks = SDL_GetTicks();
// Actualiza el contador de juego
mCounter++;
// Comprueba el teclado/mando
checkGameInput();
// Actualiza las variables del jugador
updatePlayer();
// Actualiza el fondo
updateBackground();
// Mueve los globos
updateBalloons();
// Mueve las balas
moveBullets();
// Actualiza los items
updateItems();
// Actualiza el valor de mCurrentStage
updateStage();
// Actualiza el estado de muerte
updateDeath();
// Actualiza los SmartSprites
updateSmartSprites();
// Actualiza los contadores de estado y efectos
updateTimeStoppedCounter();
updateEnemyDeployCounter();
updateShakeEffect();
// Actualiza el ayudante
updateHelper();
// Comprueba las colisiones entre globos y balas
checkBulletBalloonCollision();
// Comprueba el nivel de amenaza para ver si se han de crear nuevos enemigos
if (!mGameCompleted)
{
updateMenace();
}
// Actualiza la velocidad de los enemigos
updateBalloonSpeed();
// Actualiza el tramo final de juego, una vez completado
updateGameCompleted();
// Vacia los vectores
freeBullets();
freeBalloons();
freeItems();
freeSmartSprites();
}
// Actualiza la velocidad de los enemigos
updateBalloonSpeed();
// Actualiza el tramo final de juego, una vez completado
updateGameCompleted();
// Vacia los vectores
freeBullets();
freeBalloons();
freeItems();
}
// Actualiza el fondo
@@ -2788,9 +2818,16 @@ void Game::renderBackground()
mSpriteGrass->render();
}
// Dibuja el campo de juego
void Game::renderPlayField()
// Dibuja el juego
void Game::render()
{
// Prepara para empezar a dibujar en la textura de juego
mScreen->start();
// Limpia la pantalla
mScreen->clean(bgColor);
// Dibuja los objetos
renderBackground();
renderBalloons();
renderBullets();
@@ -2817,6 +2854,12 @@ void Game::renderPlayField()
renderFlashEffect();
mText->write(0, 0, std::to_string(balloons.size()));
// Pinta la informacion de debug
renderDebugInfo();
// Vuelca el contenido del renderizador en pantalla
mScreen->blit();
}
// Gestiona el nivel de amenaza
@@ -3193,44 +3236,11 @@ section_t Game::run()
}
}
// Comprueba que la diferencia de ticks sea mayor a la velocidad del juego
if (SDL_GetTicks() - mTicks > mTicksSpeed)
{
// Actualiza el contador de ticks
mTicks = SDL_GetTicks();
// Actualiza el contador de juego
mCounter++;
// Comprueba los eventos que hay en la cola
while (SDL_PollEvent(mEventHandler) != 0)
{
// Evento de salida de la aplicación
if (mEventHandler->type == SDL_QUIT)
{
mSection.name = PROG_SECTION_QUIT;
break;
}
}
// Actualiza la lógica del juego
updatePlayField();
}
// Prepara para empezar a dibujar en la textura de juego
mScreen->start();
// Limpia la pantalla
mScreen->clean(bgColor);
// Actualiza la lógica del juego
update();
// Dibuja los objetos
renderPlayField();
// Pinta la informacion de debug
renderDebugInfo();
// Vuelca el contenido del renderizador en pantalla
mScreen->blit();
render();
}
}
@@ -3246,15 +3256,7 @@ void Game::runPausedGame()
while ((mSection.subsection == GAME_SECTION_PAUSE) && (mSection.name == PROG_SECTION_GAME))
{
// Comprueba los eventos que hay en la cola
while (SDL_PollEvent(mEventHandler) != 0)
{
// Evento de salida de la aplicación
if (mEventHandler->type == SDL_QUIT)
{
mSection.name = PROG_SECTION_QUIT;
break;
}
}
checkEventHandler();
// Calcula la lógica de los objetos
if (SDL_GetTicks() - mTicks > mTicksSpeed)
@@ -3281,7 +3283,37 @@ void Game::runPausedGame()
mScreen->clean(bgColor);
// Pinta el escenario
renderPlayField();
{
renderBackground();
renderBalloons();
renderBullets();
renderMessages();
renderItems();
renderSmartSprites();
renderScoreBoard();
for (auto player : players)
{
player->render();
}
if ((mDeathCounter <= 150) && !players.at(0)->isAlive())
{
renderDeathFade(150 - mDeathCounter);
}
if ((mGameCompleted) && (mGameCompletedCounter >= 300))
{
renderDeathFade(mGameCompletedCounter - 300);
}
renderFlashEffect();
mText->write(0, 0, std::to_string(balloons.size()));
// Pinta la informacion de debug
renderDebugInfo();
}
mMenuPause->render();
mFade->render();
@@ -3599,4 +3631,30 @@ bool Game::allPlayersAreDead()
}
return success;
}
// Comprueba los eventos que hay en cola
void Game::checkEventHandler()
{
while (SDL_PollEvent(mEventHandler) != 0)
{
// Evento de salida de la aplicación
if (mEventHandler->type == SDL_QUIT)
{
mSection.name = PROG_SECTION_QUIT;
break;
}
else if (mEventHandler->type == SDL_KEYDOWN && mEventHandler->key.repeat == 0)
{
switch (mEventHandler->key.keysym.scancode)
{
case SDL_SCANCODE_P:
createPowerBall();
break;
default:
break;
}
}
}
}