afegit pause_manager

This commit is contained in:
2025-08-10 13:17:36 +02:00
parent 983eb7ee6f
commit d90f247bdd
3 changed files with 159 additions and 40 deletions

View File

@@ -30,6 +30,7 @@
#include "manage_hiscore_table.h" // Para HiScoreEntry, ManageHiScoreTable
#include "param.h" // Para Param, param, ParamGame, ParamScoreboard, ParamFade, ParamBalloon
#include "path_sprite.h" // Para Path, PathSprite, createPath, PathType
#include "pause_manager.h" // Para PauseManager
#include "player.h" // Para Player
#include "resource.h" // Para Resource
#include "scoreboard.h" // Para Scoreboard
@@ -50,6 +51,7 @@ Game::Game(Player::Id player_id, int current_stage, bool demo)
input_(Input::get()),
background_(std::make_unique<Background>()),
canvas_(SDL_CreateTexture(renderer_, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, param.game.play_area.rect.w, param.game.play_area.rect.h)),
pause_manager_(std::make_unique<PauseManager>([this](bool isPaused) { onPauseStateChanged(isPaused); })),
fade_in_(std::make_unique<Fade>()),
fade_out_(std::make_unique<Fade>()),
balloon_manager_(std::make_unique<BalloonManager>()),
@@ -914,7 +916,7 @@ void Game::render() {
// Actualiza los estados del juego
void Game::updateGameStates() {
if (!paused_) {
if (!pause_manager_->isPaused()) {
switch (state_) {
case State::FADE_IN:
updateGameStateFadeIn();
@@ -1121,11 +1123,11 @@ void Game::checkEvents() {
while (SDL_PollEvent(&event)) {
switch (event.type) {
case SDL_EVENT_WINDOW_FOCUS_LOST: {
pause(!demo_.enabled);
pause_manager_->setFocusLossPause(!demo_.enabled);
break;
}
case SDL_EVENT_WINDOW_FOCUS_GAINED: {
pause(false);
pause_manager_->setFocusLossPause(false);
break;
}
default:
@@ -1156,13 +1158,6 @@ void Game::updateScoreboard() {
scoreboard_->update();
}
// Pausa el juego
void Game::pause(bool value) {
paused_ = value;
screen_->attenuate(paused_);
tabe_->pauseTimer(paused_);
}
// Añade una puntuación a la tabla de records
void Game::addScoreToScoreBoard(const std::shared_ptr<Player> &player) {
const auto ENTRY = HiScoreEntry(trim(player->getLastEnterName()), player->getScore(), player->get1CC());
@@ -1242,17 +1237,16 @@ void Game::checkInput() {
// Verifica si alguno de los controladores ha solicitado una pausa y actualiza el estado de pausa del juego.
void Game::checkPauseInput() {
// Comprueba los mandos
auto gamepads = input_->getGamepads();
for (auto gamepad : gamepads) {
for (auto gamepad : input_->getGamepads()) {
if (input_->checkAction(Input::Action::PAUSE, Input::DO_NOT_ALLOW_REPEAT, Input::DO_NOT_CHECK_KEYBOARD, gamepad)) {
pause(!paused_);
pause_manager_->togglePlayerPause();
return;
}
}
// Comprueba el teclado
if (input_->checkAction(Input::Action::PAUSE, Input::DO_NOT_ALLOW_REPEAT, Input::CHECK_KEYBOARD)) {
pause(!paused_);
pause_manager_->togglePlayerPause();
return;
}
}
@@ -1872,21 +1866,11 @@ void Game::checkServiceMenu() {
return;
}
static bool was_paused_before_service_menu_ = false;
static bool service_menu_was_active_ = false;
bool service_menu_is_active = ServiceMenu::get()->isEnabled();
if (service_menu_is_active && !service_menu_was_active_) {
// El menú acaba de abrirse
was_paused_before_service_menu_ = paused_;
pause(true);
} else if (!service_menu_is_active && service_menu_was_active_) {
// El menú acaba de cerrarse
pause(was_paused_before_service_menu_);
if (ServiceMenu::get()->isEnabled()) {
pause_manager_->setServiceMenuPause(true);
} else {
pause_manager_->setServiceMenuPause(false);
}
service_menu_was_active_ = service_menu_is_active;
}
// Mueve el jugador para pintarlo al fondo de la lista de jugadores
@@ -1899,6 +1883,11 @@ void Game::sendPlayerToTheFront(const std::shared_ptr<Player> &player) {
players_to_put_at_front_.push_back(player);
}
void Game::onPauseStateChanged(bool isPaused) {
screen_->attenuate(isPaused);
tabe_->pauseTimer(isPaused);
}
#ifdef _DEBUG
// Comprueba los eventos en el modo DEBUG
void Game::checkDebugEvents(const SDL_Event &event) {