Merge feat/menu-pause — pausa del món i sons al menú de servei
This commit is contained in:
commit
7d11dde0b1
10 files changed
+75
-2
No files matched your search
@@ -38,6 +38,7 @@
|
||||
#include "game/map/map.hpp"
|
||||
#include "game/options.hpp"
|
||||
#include "game/ui/hud.hpp"
|
||||
#include "game/ui/service_menu.hpp"
|
||||
#include "utils/defaults.hpp"
|
||||
#include "utils/defines.hpp"
|
||||
#include "utils/easing.hpp"
|
||||
@@ -1120,7 +1121,17 @@ namespace {
|
||||
|
||||
void GameScene::update(int delta_ms) {
|
||||
handlePauseInput();
|
||||
updatePauseTransition(delta_ms);
|
||||
|
||||
// Congelació instantània mentre el menú de servei està obert. A
|
||||
// diferència de la pausa de gameplay (que és un dial amb easing i
|
||||
// fade de música), aquesta és binària: el món no avança gens i la
|
||||
// música no es toca. També posem en pausa el dial de la pausa
|
||||
// regular si estava a mig camí, perquè no continui mentre l'usuari
|
||||
// navega el menú.
|
||||
const bool MENU_FROZEN = ServiceMenu::get().isOpen();
|
||||
if (!MENU_FROZEN) {
|
||||
updatePauseTransition(delta_ms);
|
||||
}
|
||||
|
||||
// Transició de sala: viu en temps real (no escalada per la pausa)
|
||||
// perquè és UI. Avança avans del bloc de món perquè quan PLAYING
|
||||
@@ -1172,7 +1183,7 @@ void GameScene::update(int delta_ms) {
|
||||
constexpr bool EDITOR_FROZEN = false;
|
||||
#endif
|
||||
const int SCALED_DELTA_MS = static_cast<int>(static_cast<float>(delta_ms) * pause_.scale);
|
||||
if (!EDITOR_FROZEN && SCALED_DELTA_MS > 0) {
|
||||
if (!EDITOR_FROZEN && !MENU_FROZEN && SCALED_DELTA_MS > 0) {
|
||||
const float DT = static_cast<float>(SCALED_DELTA_MS) / 1000.0F;
|
||||
|
||||
// Pipeline de moviment en tres passes per poder intercalar la
|
||||
|
||||
@@ -459,6 +459,14 @@ namespace {
|
||||
|
||||
} // namespace
|
||||
|
||||
void ServiceMenu::playSelectSound() {
|
||||
Audio::get()->playSound(UiConfig::get().menuSelectSound(), Audio::Group::INTERFACE);
|
||||
}
|
||||
|
||||
void ServiceMenu::playAcceptSound() {
|
||||
Audio::get()->playSound(UiConfig::get().menuAcceptSound(), Audio::Group::INTERFACE);
|
||||
}
|
||||
|
||||
void ServiceMenu::handleGamepadButtonDown(const SDL_GamepadButtonEvent& ev) {
|
||||
// El botó SERVICE (per defecte BACK; remapejable per dispositiu via
|
||||
// `GamepadBindings`) tanca el menú sencer. Cada mando pot tenir el
|
||||
@@ -466,26 +474,32 @@ void ServiceMenu::handleGamepadButtonDown(const SDL_GamepadButtonEvent& ev) {
|
||||
const int SERVICE_BTN = serviceButtonForEvent(ev.which);
|
||||
if (SERVICE_BTN >= 0 && static_cast<int>(ev.button) == SERVICE_BTN) {
|
||||
close();
|
||||
playSelectSound();
|
||||
return;
|
||||
}
|
||||
switch (ev.button) {
|
||||
case SDL_GAMEPAD_BUTTON_DPAD_UP:
|
||||
moveCursor(-1);
|
||||
playSelectSound();
|
||||
break;
|
||||
case SDL_GAMEPAD_BUTTON_DPAD_DOWN:
|
||||
moveCursor(+1);
|
||||
playSelectSound();
|
||||
break;
|
||||
case SDL_GAMEPAD_BUTTON_DPAD_LEFT:
|
||||
activateCurrent(-1);
|
||||
playAcceptSound();
|
||||
break;
|
||||
case SDL_GAMEPAD_BUTTON_DPAD_RIGHT:
|
||||
case SDL_GAMEPAD_BUTTON_EAST:
|
||||
case SDL_GAMEPAD_BUTTON_NORTH:
|
||||
activateCurrent(+1);
|
||||
playAcceptSound();
|
||||
break;
|
||||
case SDL_GAMEPAD_BUTTON_WEST:
|
||||
case SDL_GAMEPAD_BUTTON_SOUTH:
|
||||
popPage();
|
||||
playSelectSound();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -567,21 +581,26 @@ auto ServiceMenu::handleEvent(const SDL_Event& ev) -> bool {
|
||||
switch (SC) {
|
||||
case SDL_SCANCODE_UP:
|
||||
moveCursor(-1);
|
||||
playSelectSound();
|
||||
break;
|
||||
case SDL_SCANCODE_DOWN:
|
||||
moveCursor(+1);
|
||||
playSelectSound();
|
||||
break;
|
||||
case SDL_SCANCODE_LEFT:
|
||||
activateCurrent(-1);
|
||||
playAcceptSound();
|
||||
break;
|
||||
case SDL_SCANCODE_RIGHT:
|
||||
case SDL_SCANCODE_RETURN:
|
||||
case SDL_SCANCODE_KP_ENTER:
|
||||
activateCurrent(+1);
|
||||
playAcceptSound();
|
||||
break;
|
||||
case SDL_SCANCODE_BACKSPACE:
|
||||
case SDL_SCANCODE_ESCAPE:
|
||||
popPage();
|
||||
playSelectSound();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
@@ -207,6 +207,12 @@ class ServiceMenu {
|
||||
// mètode propi per a mantenir la complexitat cognitiva d'`handleEvent`
|
||||
// sota el llindar de clang-tidy.
|
||||
void handleGamepadButtonDown(const SDL_GamepadButtonEvent& ev);
|
||||
|
||||
// Sons d'UI: SELECT acompanya navegació (amunt/avall) i back; ACCEPT
|
||||
// acompanya modificació d'opció (esquerra/dreta/retorn). Els noms de
|
||||
// recurs venen d'`UiConfig` i el preload el fa el Director.
|
||||
static void playSelectSound();
|
||||
static void playAcceptSound();
|
||||
[[nodiscard]] auto top() -> Page&;
|
||||
[[nodiscard]] auto topConst() const -> const Page&;
|
||||
[[nodiscard]] static auto isItemVisible(const Item& item) -> bool;
|
||||
|
||||
Reference in new issue
Block a user