feat(controls): redefinició de tecles i botons del mando des del menú de servei

This commit is contained in:
JailDesigner committed 2026-04-29 19:54:47 +02:00
1 parent 4739354875
commit 37fdcb4751
15 files changed
+1169 -80

No files matched your search

+49
View File
@@ -1,5 +1,8 @@
#pragma once
#include <SDL3/SDL.h>
#include <cstdint>
#include <string>
#include <vector>
@@ -114,9 +117,49 @@ namespace Options {
std::string path;
};
// Tecles de joc d'un jugador (vinculacions remapeables des del menú).
// Cada camp és un `SDL_Scancode` literal; els defaults venen de
// `Defaults::KeysGame*` segons el slot (P1 fletxes, P2 WASD).
struct Keyboard {
SDL_Scancode up{SDL_SCANCODE_UNKNOWN};
SDL_Scancode down{SDL_SCANCODE_UNKNOWN};
SDL_Scancode left{SDL_SCANCODE_UNKNOWN};
SDL_Scancode right{SDL_SCANCODE_UNKNOWN};
SDL_Scancode jump{SDL_SCANCODE_UNKNOWN};
SDL_Scancode attack{SDL_SCANCODE_UNKNOWN};
};
// Identificadors d'acció per als setters genèrics: una sola funció
// `setKeyboardBinding(player_id, action, scancode)` cobreix les 12
// possibles vinculacions sense haver de generar 12 setters individuals.
enum class KeyboardAction : std::uint8_t {
UP,
DOWN,
LEFT,
RIGHT,
JUMP,
ATTACK,
};
struct Controls {
GamepadAssignment gamepad_p1{};
GamepadAssignment gamepad_p2{};
Keyboard keyboard_p1{
.up = Defaults::KeysGame::UP,
.down = Defaults::KeysGame::DOWN,
.left = Defaults::KeysGame::LEFT,
.right = Defaults::KeysGame::RIGHT,
.jump = Defaults::KeysGame::JUMP,
.attack = Defaults::KeysGame::ATTACK,
};
Keyboard keyboard_p2{
.up = Defaults::KeysGameP2::UP,
.down = Defaults::KeysGameP2::DOWN,
.left = Defaults::KeysGameP2::LEFT,
.right = Defaults::KeysGameP2::RIGHT,
.jump = Defaults::KeysGameP2::JUMP,
.attack = Defaults::KeysGameP2::ATTACK,
};
};
// --- Getters de l'estat (read-only) ---
@@ -153,6 +196,12 @@ namespace Options {
// = desassignació. `player_id`: 0 = P1, 1 = P2.
void setGamepadAssignment(int player_id, const std::string& name, const std::string& path);
// Assigna un nou scancode a una acció d'un jugador i persisteix a
// `config.yaml`. `player_id`: 0 = P1, 1 = P2. Sense validació de
// conflictes — replicant la referència AEE, el mateix scancode pot
// quedar associat a múltiples accions si l'usuari ho elegeix.
void setKeyboardBinding(int player_id, KeyboardAction action, SDL_Scancode scancode);
// --- API pública: càrrega/desament de fitxers ---
void setConfigFile(const std::string& path);
auto loadFromFile() -> bool;