soport de gamepad per a wasm
This commit is contained in:
@@ -1,10 +1,20 @@
|
||||
#include "core/system/global_events.hpp"
|
||||
|
||||
#include "core/input/input.hpp" // Para Input (gamepad add/remove)
|
||||
#include "core/input/mouse.hpp"
|
||||
#include "game/options.hpp" // Para Options, options, OptionsGame, OptionsAudio
|
||||
#include "game/ui/console.hpp" // Para Console
|
||||
#include "core/locale/locale.hpp" // Para Locale
|
||||
#include "game/options.hpp" // Para Options, options, OptionsGame, OptionsAudio
|
||||
#include "game/ui/console.hpp" // Para Console
|
||||
#include "game/ui/notifier.hpp" // Para Notifier
|
||||
|
||||
namespace GlobalEvents {
|
||||
|
||||
namespace {
|
||||
// Flag per saber si en aquest frame s'ha rebut un button down del gamepad.
|
||||
// El consumeix GlobalInputs perquè un botó del comandament salti escenes.
|
||||
bool gamepad_button_pressed_ = false;
|
||||
} // namespace
|
||||
|
||||
// Comprueba los eventos que se pueden producir en cualquier sección del juego.
|
||||
// Nota: SDL_EVENT_QUIT el gestiona Director::handleEvent() directament.
|
||||
void handle(const SDL_Event& event) {
|
||||
@@ -12,6 +22,28 @@ namespace GlobalEvents {
|
||||
// reLoadTextures();
|
||||
}
|
||||
|
||||
// Connexió/desconnexió de gamepads: cal enrutar-los a Input perquè
|
||||
// afegisca el dispositiu a gamepads_. Sense això, en wasm els gamepads
|
||||
// mai es detecten (la Gamepad API del navegador només els exposa
|
||||
// després que l'usuari els active, més tard que el discoverGamepads
|
||||
// inicial). En desktop també arregla la connexió en calent.
|
||||
if (event.type == SDL_EVENT_GAMEPAD_ADDED || event.type == SDL_EVENT_GAMEPAD_REMOVED) {
|
||||
if (Input::get() != nullptr) {
|
||||
std::string name = Input::get()->handleEvent(event);
|
||||
if (!name.empty() && Notifier::get() != nullptr && Locale::get() != nullptr) {
|
||||
const std::string KEY = (event.type == SDL_EVENT_GAMEPAD_ADDED)
|
||||
? "ui.gamepad_connected"
|
||||
: "ui.gamepad_disconnected";
|
||||
Notifier::get()->show({name + " " + Locale::get()->get(KEY)});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Marcar polsació de qualsevol botó del comandament (els consumirà GlobalInputs).
|
||||
if (event.type == SDL_EVENT_GAMEPAD_BUTTON_DOWN) {
|
||||
gamepad_button_pressed_ = true;
|
||||
}
|
||||
|
||||
// Enrutar eventos de texto a la consola cuando está activa
|
||||
if (Console::get() != nullptr && Console::get()->isActive()) {
|
||||
if (event.type == SDL_EVENT_TEXT_INPUT || event.type == SDL_EVENT_KEY_DOWN) {
|
||||
@@ -22,4 +54,10 @@ namespace GlobalEvents {
|
||||
|
||||
Mouse::handleEvent(event);
|
||||
}
|
||||
|
||||
auto consumeGamepadButtonPressed() -> bool {
|
||||
const bool RESULT = gamepad_button_pressed_;
|
||||
gamepad_button_pressed_ = false;
|
||||
return RESULT;
|
||||
}
|
||||
} // namespace GlobalEvents
|
||||
Reference in New Issue
Block a user