fix: controls en el mando
This commit is contained in:
@@ -154,8 +154,9 @@ namespace GlobalInputs {
|
||||
// Detecta qué acción global ha sido presionada (si alguna)
|
||||
auto getPressedAction() -> InputAction { // NOLINT(readability-function-cognitive-complexity)
|
||||
// Qualsevol botó del comandament actua com a ACCEPT (saltar escenes
|
||||
// d'attract mode: logo, loading, credits, demo, ending...). Es prioritza
|
||||
// sobre EXIT perquè s'envia com a flag d'event, no com a check d'acció.
|
||||
// d'attract mode: logo, loading, credits, demo, ending...). El botó
|
||||
// BACK queda filtrat prèviament a GlobalEvents per no colidir amb EXIT
|
||||
// (excepte en emscripten, on BACK no pot sortir i sí pot saltar).
|
||||
if (GlobalEvents::consumeGamepadButtonPressed()) {
|
||||
return InputAction::ACCEPT;
|
||||
}
|
||||
|
||||
@@ -390,12 +390,21 @@ void Input::update() { // NOLINT(readability-convert-member-functions-to-static
|
||||
|
||||
// --- MANDOS ---
|
||||
for (const auto& gamepad : gamepads_) {
|
||||
for (auto& binding : gamepad->bindings) {
|
||||
bool button_is_down_now = static_cast<int>(SDL_GetGamepadButton(gamepad->pad, static_cast<SDL_GamepadButton>(binding.second.button))) != 0;
|
||||
for (auto& [action, state] : gamepad->bindings) {
|
||||
bool is_down_now = static_cast<int>(SDL_GetGamepadButton(gamepad->pad, static_cast<SDL_GamepadButton>(state.button))) != 0;
|
||||
|
||||
// JUMP accepta qualsevol dels 4 botons frontals (South/East/North/West)
|
||||
if (action == Action::JUMP) {
|
||||
is_down_now = is_down_now ||
|
||||
(SDL_GetGamepadButton(gamepad->pad, SDL_GAMEPAD_BUTTON_SOUTH) != 0) ||
|
||||
(SDL_GetGamepadButton(gamepad->pad, SDL_GAMEPAD_BUTTON_EAST) != 0) ||
|
||||
(SDL_GetGamepadButton(gamepad->pad, SDL_GAMEPAD_BUTTON_NORTH) != 0) ||
|
||||
(SDL_GetGamepadButton(gamepad->pad, SDL_GAMEPAD_BUTTON_WEST) != 0);
|
||||
}
|
||||
|
||||
// El estado .is_held del fotograma anterior nos sirve para saber si es un pulso nuevo
|
||||
binding.second.just_pressed = button_is_down_now && !binding.second.is_held;
|
||||
binding.second.is_held = button_is_down_now;
|
||||
state.just_pressed = is_down_now && !state.is_held;
|
||||
state.is_held = is_down_now;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -60,7 +60,12 @@ class Input {
|
||||
// Movimiento del jugador
|
||||
{Action::LEFT, ButtonState{.button = static_cast<int>(SDL_GAMEPAD_BUTTON_DPAD_LEFT)}},
|
||||
{Action::RIGHT, ButtonState{.button = static_cast<int>(SDL_GAMEPAD_BUTTON_DPAD_RIGHT)}},
|
||||
{Action::JUMP, ButtonState{.button = static_cast<int>(SDL_GAMEPAD_BUTTON_WEST)}}} {}
|
||||
{Action::JUMP, ButtonState{.button = static_cast<int>(SDL_GAMEPAD_BUTTON_WEST)}},
|
||||
// Botó BACK del mando → sortir escena / tancar joc
|
||||
{Action::EXIT, ButtonState{.button = static_cast<int>(SDL_GAMEPAD_BUTTON_BACK)}},
|
||||
{Action::CANCEL, ButtonState{.button = static_cast<int>(SDL_GAMEPAD_BUTTON_BACK)}},
|
||||
// Botó START del mando → pausa
|
||||
{Action::PAUSE, ButtonState{.button = static_cast<int>(SDL_GAMEPAD_BUTTON_START)}}} {}
|
||||
|
||||
~Gamepad() {
|
||||
if (pad != nullptr) {
|
||||
|
||||
@@ -151,6 +151,7 @@ Director::Director() {
|
||||
// perquè la textura 256x192 no es vegi minúscula al canvas HTML,
|
||||
// i desactivem el borde per aprofitar al màxim l'espai del canvas.
|
||||
Options::video.fullscreen = false;
|
||||
Options::video.integer_scale = false;
|
||||
Options::window.zoom = 4;
|
||||
Options::video.border.enabled = true;
|
||||
Options::video.border.height = 8;
|
||||
|
||||
@@ -39,9 +39,18 @@ namespace GlobalEvents {
|
||||
}
|
||||
}
|
||||
|
||||
// Marcar polsació de qualsevol botó del comandament (els consumirà GlobalInputs).
|
||||
// Marcar polsació de qualsevol botó del comandament (els consumirà GlobalInputs
|
||||
// per saltar escenes d'attract mode). El botó BACK queda exclòs perquè es
|
||||
// reserva per a l'acció EXIT — excepte a emscripten, on no es pot sortir del
|
||||
// joc i el BACK pot actuar com a botó genèric per saltar escenes.
|
||||
if (event.type == SDL_EVENT_GAMEPAD_BUTTON_DOWN) {
|
||||
#ifdef __EMSCRIPTEN__
|
||||
gamepad_button_pressed_ = true;
|
||||
#else
|
||||
if (event.gbutton.button != SDL_GAMEPAD_BUTTON_BACK) {
|
||||
gamepad_button_pressed_ = true;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
// Enrutar eventos de texto a la consola cuando está activa
|
||||
|
||||
@@ -93,10 +93,16 @@ void Title::handleEvent(const SDL_Event& event) {
|
||||
}
|
||||
|
||||
// Qualsevol botó del comandament al menú principal inicia partida directament
|
||||
// (els bindings ja estan definits, no cal "pulsar 1" amb el teclat).
|
||||
// (els bindings ja estan definits, no cal "pulsar 1" amb el teclat). El botó
|
||||
// BACK queda exclòs perquè es reserva per a EXIT — excepte a emscripten, on
|
||||
// no es pot sortir del joc i BACK pot actuar com a botó genèric d'inici.
|
||||
if (event.type == SDL_EVENT_GAMEPAD_BUTTON_DOWN &&
|
||||
state_ == State::MAIN_MENU &&
|
||||
!is_remapping_keyboard_ && !is_remapping_joystick_) {
|
||||
!is_remapping_keyboard_ && !is_remapping_joystick_
|
||||
#ifndef __EMSCRIPTEN__
|
||||
&& event.gbutton.button != SDL_GAMEPAD_BUTTON_BACK
|
||||
#endif
|
||||
) {
|
||||
handleMainMenuKeyPress(SDLK_1); // PLAY
|
||||
return;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user