|
|
|
|
@@ -210,7 +210,6 @@ void Game::updateHiScore() {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Actualiza las variables del jugador
|
|
|
|
|
void Game::updatePlayers(float deltaTime) {
|
|
|
|
|
for (auto &player : players_) {
|
|
|
|
|
@@ -223,7 +222,7 @@ void Game::updatePlayers(float deltaTime) {
|
|
|
|
|
// Si hay colisión
|
|
|
|
|
if (balloon) {
|
|
|
|
|
// Si el globo está parado y el temporizador activo, lo explota
|
|
|
|
|
if (balloon->isStopped() && time_stopped_counter_ > 0) {
|
|
|
|
|
if (balloon->isStopped() && time_stopped_timer_ > 0) {
|
|
|
|
|
balloon_manager_->popBalloon(balloon);
|
|
|
|
|
}
|
|
|
|
|
// En caso contrario, el jugador ha sido golpeado por un globo activo
|
|
|
|
|
@@ -328,16 +327,13 @@ void Game::updateGameStateGameOver(float deltaTime) {
|
|
|
|
|
checkBulletCollision();
|
|
|
|
|
cleanVectors();
|
|
|
|
|
|
|
|
|
|
if (game_over_counter_ > 0) {
|
|
|
|
|
if (game_over_counter_ >= GAME_OVER_DURATION_MS) {
|
|
|
|
|
createMessage({paths_.at(2), paths_.at(3)}, Resource::get()->getTexture("game_text_game_over"));
|
|
|
|
|
Audio::get()->fadeOutMusic(1000);
|
|
|
|
|
balloon_manager_->setBouncingSounds(true);
|
|
|
|
|
}
|
|
|
|
|
if (game_over_timer_ < GAME_OVER_DURATION_MS) {
|
|
|
|
|
handleGameOverEvents(); // Maneja eventos al inicio
|
|
|
|
|
|
|
|
|
|
game_over_counter_--;
|
|
|
|
|
game_over_timer_ += deltaTime; // Incremento time-based
|
|
|
|
|
|
|
|
|
|
if (game_over_counter_ == 150) {
|
|
|
|
|
constexpr float FADE_TRIGGER_MS = GAME_OVER_DURATION_MS - (150.0f * (1000.0f / 60.0f)); // 2500ms antes del final
|
|
|
|
|
if (game_over_timer_ >= FADE_TRIGGER_MS && !fade_out_->isEnabled()) {
|
|
|
|
|
fade_out_->activate();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@@ -350,7 +346,7 @@ void Game::updateGameStateGameOver(float deltaTime) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (fade_out_->hasEnded()) {
|
|
|
|
|
if (game_completed_counter_ > 0) {
|
|
|
|
|
if (game_completed_timer_ > 0) {
|
|
|
|
|
Section::name = Section::Name::CREDITS; // Los jugadores han completado el juego
|
|
|
|
|
} else {
|
|
|
|
|
Section::name = Section::Name::HI_SCORE_TABLE; // La partida ha terminado con la derrota de los jugadores
|
|
|
|
|
@@ -365,9 +361,6 @@ void Game::updateGameStateGameOver(float deltaTime) {
|
|
|
|
|
|
|
|
|
|
// Gestiona eventos para el estado del final del juego
|
|
|
|
|
void Game::updateGameStateCompleted(float deltaTime) {
|
|
|
|
|
constexpr int START_CELEBRATIONS = 400;
|
|
|
|
|
constexpr int END_CELEBRATIONS = START_CELEBRATIONS + 300;
|
|
|
|
|
|
|
|
|
|
updatePlayers(deltaTime);
|
|
|
|
|
updateScoreboard();
|
|
|
|
|
updateBackground();
|
|
|
|
|
@@ -379,40 +372,16 @@ void Game::updateGameStateCompleted(float deltaTime) {
|
|
|
|
|
updatePathSprites();
|
|
|
|
|
cleanVectors();
|
|
|
|
|
|
|
|
|
|
// Comienza las celebraciones
|
|
|
|
|
// Muestra el mensaje de felicitación y da los puntos a los jugadores
|
|
|
|
|
if (game_completed_counter_ == START_CELEBRATIONS) {
|
|
|
|
|
createMessage({paths_.at(4), paths_.at(5)}, Resource::get()->getTexture("game_text_congratulations"));
|
|
|
|
|
createMessage({paths_.at(6), paths_.at(7)}, Resource::get()->getTexture("game_text_1000000_points"));
|
|
|
|
|
|
|
|
|
|
for (auto &player : players_) {
|
|
|
|
|
if (player->isPlaying()) {
|
|
|
|
|
player->addScore(1000000, Options::settings.hi_score_table.back().score);
|
|
|
|
|
player->setPlayingState(Player::State::CELEBRATING);
|
|
|
|
|
} else {
|
|
|
|
|
player->setPlayingState(Player::State::GAME_OVER);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
updateHiScore();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Termina las celebraciones
|
|
|
|
|
if (game_completed_counter_ == END_CELEBRATIONS) {
|
|
|
|
|
for (auto &player : players_) {
|
|
|
|
|
if (player->isCelebrating()) {
|
|
|
|
|
player->setPlayingState(player->qualifiesForHighScore() ? Player::State::ENTERING_NAME_GAME_COMPLETED : Player::State::LEAVING_SCREEN);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// Maneja eventos del juego completado
|
|
|
|
|
handleGameCompletedEvents();
|
|
|
|
|
|
|
|
|
|
// Si los jugadores ya no estan y no quedan mensajes en pantalla
|
|
|
|
|
if (allPlayersAreGameOver() && path_sprites_.empty()) {
|
|
|
|
|
setState(State::GAME_OVER);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Incrementa el contador al final
|
|
|
|
|
++game_completed_counter_;
|
|
|
|
|
// Incrementa el acumulador al final
|
|
|
|
|
game_completed_timer_ += deltaTime;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Comprueba el estado del juego
|
|
|
|
|
@@ -894,11 +863,11 @@ void Game::updateTimeStopped(float deltaTime) {
|
|
|
|
|
static constexpr float CLOCK_SOUND_INTERVAL_MS = 500.0f; // 30 frames a 60fps
|
|
|
|
|
static constexpr float COLOR_FLASH_INTERVAL_MS = 250.0f; // 15 frames a 60fps
|
|
|
|
|
|
|
|
|
|
if (time_stopped_counter_ > 0) {
|
|
|
|
|
time_stopped_counter_ -= deltaTime;
|
|
|
|
|
if (time_stopped_timer_ > 0) {
|
|
|
|
|
time_stopped_timer_ -= deltaTime;
|
|
|
|
|
|
|
|
|
|
// Fase de advertencia (últimos 2 segundos)
|
|
|
|
|
if (time_stopped_counter_ <= WARNING_THRESHOLD_MS) {
|
|
|
|
|
if (time_stopped_timer_ <= WARNING_THRESHOLD_MS) {
|
|
|
|
|
static float last_sound_time = 0.0f;
|
|
|
|
|
last_sound_time += deltaTime;
|
|
|
|
|
|
|
|
|
|
@@ -924,7 +893,6 @@ void Game::updateTimeStopped(float deltaTime) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Actualiza toda la lógica del juego
|
|
|
|
|
void Game::update(float deltaTime) {
|
|
|
|
|
screen_->update();
|
|
|
|
|
@@ -1010,12 +978,12 @@ void Game::fillCanvas() {
|
|
|
|
|
void Game::enableTimeStopItem() {
|
|
|
|
|
balloon_manager_->stopAllBalloons();
|
|
|
|
|
balloon_manager_->reverseColorsToAllBalloons();
|
|
|
|
|
time_stopped_counter_ = TIME_STOPPED_DURATION_MS;
|
|
|
|
|
time_stopped_timer_ = TIME_STOPPED_DURATION_MS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Deshabilita el efecto del item de detener el tiempo
|
|
|
|
|
void Game::disableTimeStopItem() {
|
|
|
|
|
time_stopped_counter_ = 0;
|
|
|
|
|
time_stopped_timer_ = 0;
|
|
|
|
|
balloon_manager_->startAllBalloons();
|
|
|
|
|
balloon_manager_->normalColorsToAllBalloons();
|
|
|
|
|
}
|
|
|
|
|
@@ -1925,6 +1893,55 @@ void Game::onPauseStateChanged(bool is_paused) {
|
|
|
|
|
tabe_->pauseTimer(is_paused);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Maneja eventos del juego completado usando flags para triggers únicos
|
|
|
|
|
void Game::handleGameCompletedEvents() {
|
|
|
|
|
constexpr float START_CELEBRATIONS_MS = 6667.0f; // 400 frames a 60fps
|
|
|
|
|
constexpr float END_CELEBRATIONS_MS = 11667.0f; // 700 frames a 60fps
|
|
|
|
|
|
|
|
|
|
// Inicio de celebraciones
|
|
|
|
|
static bool start_celebrations_triggered = false;
|
|
|
|
|
if (!start_celebrations_triggered && game_completed_timer_ >= START_CELEBRATIONS_MS) {
|
|
|
|
|
createMessage({paths_.at(4), paths_.at(5)}, Resource::get()->getTexture("game_text_congratulations"));
|
|
|
|
|
createMessage({paths_.at(6), paths_.at(7)}, Resource::get()->getTexture("game_text_1000000_points"));
|
|
|
|
|
|
|
|
|
|
for (auto &player : players_) {
|
|
|
|
|
if (player->isPlaying()) {
|
|
|
|
|
player->addScore(1000000, Options::settings.hi_score_table.back().score);
|
|
|
|
|
player->setPlayingState(Player::State::CELEBRATING);
|
|
|
|
|
} else {
|
|
|
|
|
player->setPlayingState(Player::State::GAME_OVER);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
updateHiScore();
|
|
|
|
|
start_celebrations_triggered = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Fin de celebraciones
|
|
|
|
|
static bool end_celebrations_triggered = false;
|
|
|
|
|
if (!end_celebrations_triggered && game_completed_timer_ >= END_CELEBRATIONS_MS) {
|
|
|
|
|
for (auto &player : players_) {
|
|
|
|
|
if (player->isCelebrating()) {
|
|
|
|
|
player->setPlayingState(player->qualifiesForHighScore() ? Player::State::ENTERING_NAME_GAME_COMPLETED : Player::State::LEAVING_SCREEN);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fade_out_->activate();
|
|
|
|
|
end_celebrations_triggered = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Maneja eventos de game over usando flag para trigger único
|
|
|
|
|
void Game::handleGameOverEvents() {
|
|
|
|
|
static bool game_over_triggered = false;
|
|
|
|
|
if (!game_over_triggered && game_over_timer_ == 0.0f) {
|
|
|
|
|
createMessage({paths_.at(2), paths_.at(3)}, Resource::get()->getTexture("game_text_game_over"));
|
|
|
|
|
Audio::get()->fadeOutMusic(1000);
|
|
|
|
|
balloon_manager_->setBouncingSounds(true);
|
|
|
|
|
game_over_triggered = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef _DEBUG
|
|
|
|
|
// Comprueba los eventos en el modo DEBUG
|
|
|
|
|
void Game::handleDebugEvents(const SDL_Event &event) {
|
|
|
|
|
@@ -2001,53 +2018,4 @@ void Game::handleDebugEvents(const SDL_Event &event) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Maneja eventos del juego completado usando flags para triggers únicos
|
|
|
|
|
void Game::handleGameCompletedEvents() {
|
|
|
|
|
constexpr float START_CELEBRATIONS_MS = 6667.0f; // 400 frames a 60fps
|
|
|
|
|
constexpr float END_CELEBRATIONS_MS = 11667.0f; // 700 frames a 60fps
|
|
|
|
|
|
|
|
|
|
// Inicio de celebraciones
|
|
|
|
|
static bool start_celebrations_triggered = false;
|
|
|
|
|
if (!start_celebrations_triggered && game_completed_counter_ >= START_CELEBRATIONS_MS) {
|
|
|
|
|
createMessage({paths_.at(4), paths_.at(5)}, Resource::get()->getTexture("game_text_congratulations"));
|
|
|
|
|
createMessage({paths_.at(6), paths_.at(7)}, Resource::get()->getTexture("game_text_1000000_points"));
|
|
|
|
|
|
|
|
|
|
for (auto &player : players_) {
|
|
|
|
|
if (player->isPlaying()) {
|
|
|
|
|
player->addScore(1000000, Options::settings.hi_score_table.back().score);
|
|
|
|
|
player->setPlayingState(Player::State::CELEBRATING);
|
|
|
|
|
} else {
|
|
|
|
|
player->setPlayingState(Player::State::GAME_OVER);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
updateHiScore();
|
|
|
|
|
start_celebrations_triggered = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Fin de celebraciones
|
|
|
|
|
static bool end_celebrations_triggered = false;
|
|
|
|
|
if (!end_celebrations_triggered && game_completed_counter_ >= END_CELEBRATIONS_MS) {
|
|
|
|
|
for (auto &player : players_) {
|
|
|
|
|
if (player->isCelebrating()) {
|
|
|
|
|
player->setPlayingState(player->qualifiesForHighScore() ? Player::State::ENTERING_NAME_GAME_COMPLETED : Player::State::LEAVING_SCREEN);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fade_out_->activate();
|
|
|
|
|
end_celebrations_triggered = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Maneja eventos de game over usando flag para trigger único
|
|
|
|
|
void Game::handleGameOverEvents() {
|
|
|
|
|
static bool game_over_triggered = false;
|
|
|
|
|
if (!game_over_triggered && game_over_counter_ >= GAME_OVER_DURATION_MS) {
|
|
|
|
|
createMessage({paths_.at(2), paths_.at(3)}, Resource::get()->getTexture("game_text_game_over"));
|
|
|
|
|
Audio::get()->fadeOutMusic(1000);
|
|
|
|
|
balloon_manager_->setBouncingSounds(true);
|
|
|
|
|
game_over_triggered = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#endif
|