feat(controls): redefinició de tecles i botons del mando des del menú de servei
This commit is contained in:
1 parent
4739354875
commit
37fdcb4751
15 files changed
+1169
-80
No files matched your search
@@ -3,11 +3,13 @@
|
||||
#include <SDL3/SDL.h>
|
||||
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "core/input/define_buttons.hpp"
|
||||
#include "core/rendering/surface.hpp" // Palette
|
||||
|
||||
class Text;
|
||||
@@ -56,6 +58,21 @@ class ServiceMenu {
|
||||
// false; és el caller qui decideix obrir-lo amb la hotkey.
|
||||
auto handleEvent(const SDL_Event& ev) -> bool;
|
||||
|
||||
// True mentre estem esperant que l'usuari pulse una tecla per assignar
|
||||
// a l'item KEY_BIND seleccionat. El Director redirigeix els KEY_DOWN
|
||||
// a `captureKey` mentre dura — replica `Menu::isCapturing` d'AEE.
|
||||
[[nodiscard]] auto isCapturing() const -> bool { return capturing_; }
|
||||
|
||||
// Aplica l'scancode capturat a l'item seleccionat (si encara és KEY_BIND
|
||||
// i té setter). ESCAPE cancel·la sense assignar.
|
||||
void captureKey(SDL_Scancode sc);
|
||||
|
||||
// Arranca el sub-mòdul `DefineButtons` per al mando indicat. El menú
|
||||
// queda "obert" però els events del mando es redirigeixen al sub-mòdul
|
||||
// fins que acabi la seqüència o l'usuari pulse ESC. Replica el patró
|
||||
// `define_buttons_->enable(...)` de coffee_crisis_arcade_edition.
|
||||
void startDefineButtons(SDL_Gamepad* pad, const std::string& name, const std::string& path);
|
||||
|
||||
private:
|
||||
// --- Struct d'un item d'una pàgina ---
|
||||
//
|
||||
@@ -185,6 +202,11 @@ class ServiceMenu {
|
||||
// --- Navegació i estat ---
|
||||
void pushPage(Page page);
|
||||
void popPage();
|
||||
|
||||
// Tractament del bloc d'events de gamepad (BUTTON_DOWN). Extret a
|
||||
// mètode propi per a mantenir la complexitat cognitiva d'`handleEvent`
|
||||
// sota el llindar de clang-tidy.
|
||||
void handleGamepadButtonDown(const SDL_GamepadButtonEvent& ev);
|
||||
[[nodiscard]] auto top() -> Page&;
|
||||
[[nodiscard]] auto topConst() const -> const Page&;
|
||||
[[nodiscard]] static auto isItemVisible(const Item& item) -> bool;
|
||||
@@ -211,6 +233,14 @@ class ServiceMenu {
|
||||
[[nodiscard]] static auto makeShaderTypeItem() -> Item;
|
||||
[[nodiscard]] static auto makeShaderPresetItem() -> Item;
|
||||
|
||||
// Fàbrica genèrica per a un KEY_BIND vinculat a una acció del jugador
|
||||
// `player_id`. Llegeix d'`Options::controls().keyboard_p*` i delega
|
||||
// la mutació a `Options::setKeyboardBinding(...)` (persisteix).
|
||||
[[nodiscard]] static auto makeKeyboardItem(
|
||||
const std::string& label_key,
|
||||
int player_id,
|
||||
std::uint8_t action) -> Item;
|
||||
|
||||
// --- Render ---
|
||||
// "Visible" inclou l'animació de tancament: retorna true mentre la caixa
|
||||
// encara ha de dibuixar-se, encara que open_ siga false.
|
||||
@@ -232,4 +262,11 @@ class ServiceMenu {
|
||||
float animated_h_{0.0F}; // Alçada suavitzada cap a `targetBoxHeight`.
|
||||
bool transition_active_{false}; // Push/pop de pàgina en curs.
|
||||
float transition_progress_{0.0F}; // 0 → 1 durant la transició de pàgina.
|
||||
bool capturing_{false}; // True mentre esperem una tecla per a un KEY_BIND.
|
||||
|
||||
// Sub-mòdul de captura de botons del mando. Quan està actiu absorbeix
|
||||
// tots els events de mando (BUTTON_DOWN/UP, AXIS_MOTION) i, en acabar,
|
||||
// persisteix la nova configuració via `GamepadBindings`. Replica el
|
||||
// patró `define_buttons_` de coffee_crisis_arcade_edition.
|
||||
DefineButtons define_buttons_;
|
||||
};
|
||||
Reference in new issue
Block a user