time-based: sub-states pause/gameover sense gate, pause_counter decrementa a 60Hz fixe amb acumulador de fase
This commit is contained in:
+121
-7
@@ -2977,10 +2977,10 @@ void Game::iterate() {
|
||||
|
||||
switch (section_->subsection) {
|
||||
case SUBSECTION_GAME_PAUSE:
|
||||
iteratePaused();
|
||||
iteratePaused(DELTA_TIME_S);
|
||||
break;
|
||||
case SUBSECTION_GAME_GAMEOVER:
|
||||
iterateGameOver();
|
||||
iterateGameOver(DELTA_TIME_S);
|
||||
break;
|
||||
case SUBSECTION_GAME_PLAY_1P:
|
||||
case SUBSECTION_GAME_PLAY_2P:
|
||||
@@ -2992,16 +2992,16 @@ void Game::iterate() {
|
||||
}
|
||||
|
||||
// Rama de iterate(): pause
|
||||
void Game::iteratePaused() {
|
||||
void Game::iteratePaused(float dt_s) {
|
||||
if (!pause_initialized_) { enterPausedGame(); }
|
||||
updatePausedGame();
|
||||
updatePausedGame(dt_s);
|
||||
renderPausedGame();
|
||||
}
|
||||
|
||||
// Rama de iterate(): game over
|
||||
void Game::iterateGameOver() {
|
||||
void Game::iterateGameOver(float dt_s) {
|
||||
if (!game_over_initialized_) { enterGameOverScreen(); }
|
||||
updateGameOverScreen();
|
||||
updateGameOverScreen(dt_s);
|
||||
renderGameOverScreen();
|
||||
}
|
||||
|
||||
@@ -3074,6 +3074,17 @@ void Game::updatePausedGame() {
|
||||
}
|
||||
}
|
||||
|
||||
// Actualiza el menu de pausa (time-based)
|
||||
void Game::updatePausedGame(float dt_s) {
|
||||
GlobalInputs::handle();
|
||||
|
||||
if (leaving_pause_menu_) {
|
||||
updateLeavingPauseMenu(dt_s);
|
||||
} else {
|
||||
updatePauseMenuUI(dt_s);
|
||||
}
|
||||
}
|
||||
|
||||
// Rama de updatePausedGame: cuenta atrás de salida y vuelta al juego
|
||||
void Game::updateLeavingPauseMenu() {
|
||||
if (pause_counter_ > 0) { // El contador está descendiendo
|
||||
@@ -3096,7 +3107,69 @@ void Game::updateLeavingPauseMenu() {
|
||||
}
|
||||
}
|
||||
|
||||
// Rama de updatePausedGame: lógica del menú de pausa
|
||||
// Cuenta atrás de salida (time-based). Decrementa pause_counter_ a 60Hz exactes
|
||||
// amb un acumulador de fase, per a mantenir els sons de rellotge als llindars
|
||||
// originals (90, 60, 30 frames = 1.5s, 1.0s, 0.5s restants).
|
||||
void Game::updateLeavingPauseMenu(float dt_s) {
|
||||
if (pause_counter_ <= 0) {
|
||||
section_->name = SECTION_PROG_GAME;
|
||||
section_->subsection = num_players_ == 1 ? SUBSECTION_GAME_PLAY_1P : SUBSECTION_GAME_PLAY_2P;
|
||||
if (Audio::getRealMusicState() == Audio::MusicState::PAUSED) {
|
||||
Audio::get()->resumeMusic();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
constexpr float STEP_S = 1.0F / 60.0F;
|
||||
pause_counter_phase_s_ += dt_s;
|
||||
while (pause_counter_phase_s_ >= STEP_S && pause_counter_ > 0) {
|
||||
pause_counter_phase_s_ -= STEP_S;
|
||||
if (pause_counter_ == 90 || pause_counter_ == 60 || pause_counter_ == 30) {
|
||||
Audio::get()->playSound(clock_sound_);
|
||||
}
|
||||
pause_counter_--;
|
||||
}
|
||||
}
|
||||
|
||||
// Lógica del menú de pausa (time-based)
|
||||
void Game::updatePauseMenuUI(float dt_s) {
|
||||
pause_menu_->update();
|
||||
pause_menu_->checkInput();
|
||||
|
||||
if (Input::get()->checkInput(Input::Action::PAUSE, Input::Repeat::OFF)) {
|
||||
leaving_pause_menu_ = true;
|
||||
pause_counter_phase_s_ = 0.0F;
|
||||
if (!Options::gameplay.pause_countdown) {
|
||||
pause_counter_ = 0;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
switch (pause_menu_->getItemSelected()) {
|
||||
case 1:
|
||||
leaving_pause_menu_ = true;
|
||||
pause_counter_phase_s_ = 0.0F;
|
||||
if (!Options::gameplay.pause_countdown) {
|
||||
pause_counter_ = 0;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
fade_->setFadeType(Fade::Type::CENTER);
|
||||
fade_->activateFade();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
fade_->update(dt_s);
|
||||
if (fade_->hasEnded()) {
|
||||
section_->name = SECTION_PROG_TITLE;
|
||||
section_->subsection = SUBSECTION_TITLE_1;
|
||||
Audio::get()->stopMusic();
|
||||
}
|
||||
}
|
||||
|
||||
// Rama de updatePausedGame: lógica del menú de pausa (frame-based)
|
||||
void Game::updatePauseMenuUI() {
|
||||
pause_menu_->update();
|
||||
pause_menu_->checkInput();
|
||||
@@ -3254,6 +3327,47 @@ void Game::updateGameOverScreen() {
|
||||
}
|
||||
}
|
||||
|
||||
// Actualiza los elementos de la pantalla de game over (time-based)
|
||||
void Game::updateGameOverScreen(float dt_s) {
|
||||
GlobalInputs::handle();
|
||||
|
||||
game_over_menu_->update();
|
||||
fade_->update(dt_s);
|
||||
|
||||
if (fade_->hasEnded()) {
|
||||
switch (game_over_post_fade_) {
|
||||
case 0: // YES
|
||||
section_->name = SECTION_PROG_GAME;
|
||||
deleteAllVectorObjects();
|
||||
init();
|
||||
section_->subsection = num_players_ == 1 ? SUBSECTION_GAME_PLAY_1P : SUBSECTION_GAME_PLAY_2P;
|
||||
break;
|
||||
case 1: // NO
|
||||
section_->name = SECTION_PROG_TITLE;
|
||||
section_->subsection = SUBSECTION_TITLE_1;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!game_completed_) {
|
||||
game_over_menu_->checkInput();
|
||||
switch (game_over_menu_->getItemSelected()) {
|
||||
case 0: // YES
|
||||
game_over_post_fade_ = 0;
|
||||
fade_->activateFade();
|
||||
break;
|
||||
case 1: // NO
|
||||
game_over_post_fade_ = 1;
|
||||
fade_->activateFade();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Dibuja los elementos de la pantalla de game over
|
||||
void Game::renderGameOverScreen() {
|
||||
// Prepara para empezar a dibujar en la textura de juego
|
||||
|
||||
Reference in New Issue
Block a user