From 301e0145fbd1abf725225d071907b300165a4eda Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Sun, 29 Mar 2026 18:24:47 +0200 Subject: [PATCH] la consola ja no pausa al jugador --- source/game/entities/player.cpp | 1 + source/game/entities/player.hpp | 2 ++ source/game/scenes/game.cpp | 18 +++++++++--------- source/game/ui/console.cpp | 2 ++ source/game/ui/console.hpp | 10 +++++++--- 5 files changed, 21 insertions(+), 12 deletions(-) diff --git a/source/game/entities/player.cpp b/source/game/entities/player.cpp index 4235cab..f901e6c 100644 --- a/source/game/entities/player.cpp +++ b/source/game/entities/player.cpp @@ -55,6 +55,7 @@ void Player::update(float delta_time) { // Comprueba las entradas y modifica variables void Player::handleInput() { + if (ignore_input_) { return; } if (Input::get()->checkAction(InputAction::LEFT)) { wanna_go_ = Direction::LEFT; } else if (Input::get()->checkAction(InputAction::RIGHT)) { diff --git a/source/game/entities/player.hpp b/source/game/entities/player.hpp index 6cb5065..bea4004 100644 --- a/source/game/entities/player.hpp +++ b/source/game/entities/player.hpp @@ -105,6 +105,7 @@ class Player { //[[nodiscard]] auto isAlive() const -> bool { return is_alive_ || (Options::cheats.invincible == Options::Cheat::State::ENABLED); } // Comprueba si el jugador esta vivo [[nodiscard]] auto isAlive() const -> bool { return is_alive_; } // Comprueba si el jugador esta vivo void setPaused(bool value) { is_paused_ = value; } // Pone el jugador en modo pausa + void setIgnoreInput(bool value) { ignore_input_ = value; } // Ignora inputs del jugador (física sigue activa) #ifdef _DEBUG // --- Funciones de debug --- @@ -146,6 +147,7 @@ class Player { // --- Variables de juego --- bool is_alive_ = true; // Indica si el jugador esta vivo o no bool is_paused_ = false; // Indica si el jugador esta en modo pausa + bool ignore_input_ = false; // Ignora inputs pero mantiene la física activa bool auto_movement_ = false; // Indica si esta siendo arrastrado por una superficie automatica Room::Border border_ = Room::Border::TOP; // Indica en cual de los cuatro bordes se encuentra int last_grounded_position_ = 0; // Ultima posición en Y en la que se estaba en contacto con el suelo (hace doble función: tracking de caída + altura inicial del salto) diff --git a/source/game/scenes/game.cpp b/source/game/scenes/game.cpp index db0002e..8953aec 100644 --- a/source/game/scenes/game.cpp +++ b/source/game/scenes/game.cpp @@ -65,6 +65,7 @@ Game::Game(Mode mode) Cheevos::get()->clearUnobtainableState(); GameControl::refresh_player_color = [this]() -> void { player_->setColor(); }; + Console::get()->on_toggle = [this](bool open) { player_->setIgnoreInput(open); }; GameControl::change_player_skin = [this](int skin_num) -> void { Options::game.player_skin = skin_num; player_->setSkin(skin_num); @@ -116,6 +117,7 @@ Game::~Game() { GameControl::refresh_player_color = nullptr; GameControl::change_player_skin = nullptr; + Console::get()->on_toggle = nullptr; #ifdef _DEBUG GameControl::change_room = nullptr; @@ -229,19 +231,17 @@ void Game::updatePlaying(float delta_time) { room_->update(delta_time); switch (mode_) { case Mode::GAME: - if (!Console::get()->isActive()) { #ifdef _DEBUG - // Maneja el arrastre del jugador con el ratón (debug) - handleDebugMouseDrag(delta_time); + // Maneja el arrastre del jugador con el ratón (debug) + handleDebugMouseDrag(delta_time); - // Si estamos arrastrando, no ejecutar la física normal del jugador - if (!debug_dragging_player_) { - player_->update(delta_time); - } -#else + // Si estamos arrastrando, no ejecutar la física normal del jugador + if (!debug_dragging_player_) { player_->update(delta_time); -#endif } +#else + player_->update(delta_time); +#endif checkPlayerIsOnBorder(); checkPlayerAndItems(); checkPlayerAndEnemies(); diff --git a/source/game/ui/console.cpp b/source/game/ui/console.cpp index 0690292..d06f19d 100644 --- a/source/game/ui/console.cpp +++ b/source/game/ui/console.cpp @@ -907,6 +907,7 @@ void Console::toggle() { cursor_visible_ = true; SDL_StartTextInput(SDL_GetKeyboardFocus()); if (Notifier::get() != nullptr) { Notifier::get()->addYOffset(static_cast(height_)); } + if (on_toggle) { on_toggle(true); } break; case Status::ACTIVE: status_ = Status::VANISHING; @@ -915,6 +916,7 @@ void Console::toggle() { saved_input_.clear(); SDL_StopTextInput(SDL_GetKeyboardFocus()); if (Notifier::get() != nullptr) { Notifier::get()->removeYOffset(static_cast(height_)); } + if (on_toggle) { on_toggle(false); } break; default: // Durante RISING o VANISHING no se hace nada diff --git a/source/game/ui/console.hpp b/source/game/ui/console.hpp index 60bac8c..9d0b029 100644 --- a/source/game/ui/console.hpp +++ b/source/game/ui/console.hpp @@ -2,9 +2,10 @@ #include -#include // Para deque (historial) -#include // Para shared_ptr -#include // Para string +#include // Para deque (historial) +#include // Para function +#include // Para shared_ptr +#include // Para string class Surface; class Sprite; @@ -28,6 +29,9 @@ class Console { auto getVisibleHeight() -> int; // Píxeles visibles actuales (0 = oculta, height_ = totalmente visible) [[nodiscard]] auto getText() const -> std::shared_ptr { return text_; } + // Callback llamado al abrir (true) o cerrar (false) la consola + std::function on_toggle; + private: enum class Status { HIDDEN,