From 6515ec6c7b259645488010636e5e5651bde64063 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Sun, 6 Oct 2024 21:02:49 +0200 Subject: [PATCH] Els panels dels marcadors ja passen a game over sense pasar per waiting un frame gracies a una parafernalia que he montat --- source/game.cpp | 88 +++++++++++++------------------------------ source/game.h | 4 +- source/player.cpp | 2 +- source/scoreboard.cpp | 16 +++++--- 4 files changed, 40 insertions(+), 70 deletions(-) diff --git a/source/game.cpp b/source/game.cpp index 3d21d15..6081ed0 100644 --- a/source/game.cpp +++ b/source/game.cpp @@ -942,16 +942,6 @@ void Game::updateStage() // Actualiza el estado de fin de la partida void Game::updateGameOver() { - // Comprueba si todos los jugadores estan esperando - if (allPlayersAreWaiting()) - { - // Entonces los pone en estado de Game Over - for (auto player : players) - { - player->setStatusPlaying(playerStatus::GAME_OVER); - } - } - // Si todos estan en estado de Game Over if (allPlayersAreGameOver()) { @@ -1895,7 +1885,7 @@ void Game::update() updatePlayers(); // Actualiza el marcador - // checkPlayersStatusPlaying(); + checkPlayersStatusPlaying(); updateScoreboard(); // Actualiza el fondo @@ -2579,12 +2569,12 @@ void Game::updateHelper() } // Comprueba si todos los jugadores han terminado de jugar -bool Game::allPlayersAreWaiting() +bool Game::allPlayersAreWaitingOrGameOver() { bool success = true; for (auto player : players) { - success &= player->isWaiting(); + success &= player->isWaiting() || player->isGameOver(); } return success; @@ -2828,65 +2818,39 @@ void Game::addScoreToScoreBoard(std::string name, int score) } // Comprueba el estado de los jugadores -/*void Game::checkPlayersStatusPlaying() +void Game::checkPlayersStatusPlaying() { if (demo.enabled) { return; } - for (auto player : players) + // Comprueba si todos los jugadores estan esperando + if (allPlayersAreWaitingOrGameOver()) { - switch (player->getStatusPlaying()) + // Entonces los pone en estado de Game Over + for (auto player : players) { - case playerStatus::PLAYING: - { - scoreboard->setMode(player->getScoreBoardPanel(), scoreboardMode::SCORE); - break; - } - - case playerStatus::CONTINUE: - { - scoreboard->setMode(player->getScoreBoardPanel(), scoreboardMode::CONTINUE); - scoreboard->setContinue(player->getScoreBoardPanel(), player->getContinueCounter()); - break; - } - - case playerStatus::WAITING: - { - scoreboard->setMode(player->getScoreBoardPanel(), scoreboardMode::WAITING); - break; - } - - case playerStatus::ENTERING_NAME: - { - scoreboard->setMode(player->getScoreBoardPanel(), scoreboardMode::ENTER_NAME); - scoreboard->setRecordName(player->getScoreBoardPanel(), player->getRecordName()); - scoreboard->setSelectorPos(player->getScoreBoardPanel(), player->getRecordNamePos()); - break; - } - - case playerStatus::DYING: - break; - - case playerStatus::DIED: - { - const playerStatus nextPlayerStatus = IsEligibleForHighScore(player->getScore()) ? playerStatus::ENTERING_NAME : playerStatus::CONTINUE; - demo.enabled ? player->setStatusPlaying(playerStatus::WAITING) : player->setStatusPlaying(nextPlayerStatus); - break; - } - - case playerStatus::GAME_OVER: - { - scoreboard->setMode(player->getScoreBoardPanel(), scoreboardMode::GAME_OVER); - break; - } - - default: - break; + player->setStatusPlaying(playerStatus::GAME_OVER); } } -}*/ + + // Saca del estado de GAME OVER al primer jugador si el segundo está activo + const bool a1 = players[0]->isGameOver(); + const bool b1 = !players[1]->isGameOver() && !players[1]->isWaiting(); + if (a1 && b1) + { + players[0]->setStatusPlaying(playerStatus::WAITING); + } + + // Saca del estado de GAME OVER al segundo jugador si el primero está activo + const bool a2 = players[1]->isGameOver(); + const bool b2 = !players[0]->isGameOver() && !players[0]->isWaiting(); + if (a2 && b2) + { + players[1]->setStatusPlaying(playerStatus::WAITING); + } +} // Obtiene un jugador a partir de su "id" Player *Game::getPlayer(int id) diff --git a/source/game.h b/source/game.h index 592c5fe..98e3d8a 100644 --- a/source/game.h +++ b/source/game.h @@ -412,7 +412,7 @@ private: void updateHelper(); // Comprueba si todos los jugadores han terminado de jugar - bool allPlayersAreWaiting(); + bool allPlayersAreWaitingOrGameOver(); // Comprueba si todos los jugadores han terminado de jugar bool allPlayersAreGameOver(); @@ -445,7 +445,7 @@ private: void addScoreToScoreBoard(std::string name, int score); // Comprueba el estado de juego de los jugadores - //void checkPlayersStatusPlaying(); + void checkPlayersStatusPlaying(); // Obtiene un jugador a partir de su "id" Player *getPlayer(int id); diff --git a/source/player.cpp b/source/player.cpp index 679a314..daf56df 100644 --- a/source/player.cpp +++ b/source/player.cpp @@ -724,7 +724,7 @@ void Player::decContinueCounter() continueCounter--; if (continueCounter < 0) { - setStatusPlaying(playerStatus::WAITING); + setStatusPlaying(playerStatus::GAME_OVER); } } diff --git a/source/scoreboard.cpp b/source/scoreboard.cpp index b7b446a..949d281 100644 --- a/source/scoreboard.cpp +++ b/source/scoreboard.cpp @@ -15,19 +15,19 @@ Scoreboard *Scoreboard::scoreboard = nullptr; // [SINGLETON] Crearemos el objeto scoreboard con esta función estática void Scoreboard::init(SDL_Renderer *renderer) { - Scoreboard::scoreboard = new Scoreboard(renderer); + Scoreboard::scoreboard = new Scoreboard(renderer); } // [SINGLETON] Destruiremos el objeto scoreboard con esta función estática void Scoreboard::destroy() { - delete Scoreboard::scoreboard; + delete Scoreboard::scoreboard; } // [SINGLETON] Con este método obtenemos el objeto scoreboard y podemos trabajar con él Scoreboard *Scoreboard::get() { - return Scoreboard::scoreboard; + return Scoreboard::scoreboard; } // Constructor @@ -263,7 +263,7 @@ void Scoreboard::fillPanelTextures() switch (panel[i].mode) { case scoreboardMode::SCORE: - { + { // SCORE textScoreBoard->writeCentered(slot4_1.x, slot4_1.y, name[i]); textScoreBoard->writeCentered(slot4_2.x, slot4_2.y, updateScoreText(score[i])); @@ -306,7 +306,13 @@ void Scoreboard::fillPanelTextures() { // GAME OVER textScoreBoard->writeCentered(slot4_1.x, slot4_1.y + 4, lang::getText(102)); - textScoreBoard->writeCentered(slot4_3.x, slot4_3.y + 4, lang::getText(114)); + + // PLEASE WAIT + if (counter % 10 < 8) + { + textScoreBoard->writeCentered(slot4_3.x, slot4_3.y - 2, lang::getText(114)); + textScoreBoard->writeCentered(slot4_4.x, slot4_4.y - 2, lang::getText(115)); + } break; }