diff --git a/source/core/input/input.cpp b/source/core/input/input.cpp index 92682ad..ac0c210 100644 --- a/source/core/input/input.cpp +++ b/source/core/input/input.cpp @@ -8,6 +8,8 @@ #include // Para unordered_map, _Node_iterator, operator==, _Node_iterator_base, _Node_const_iterator #include // Para pair, move +#include "game/options.hpp" // Para Options::controls + // Singleton Input* Input::instance = nullptr; @@ -26,8 +28,7 @@ auto Input::get() -> Input* { return Input::instance; } Input::Input(std::string game_controller_db_path, std::string gamepad_configs_file) : gamepad_mappings_file_(std::move(game_controller_db_path)), gamepad_configs_file_(std::move(gamepad_configs_file)) { - // Inicializa el subsistema SDL_INIT_GAMEPAD - initSDLGamePad(); + initSDLGamePad(); // Inicializa el subsistema SDL_INIT_GAMEPAD } // Asigna inputs a teclas @@ -35,6 +36,13 @@ void Input::bindKey(Action action, SDL_Scancode code) { keyboard_.bindings[action].scancode = code; } +// Aplica las teclas configuradas desde Options +void Input::applyKeyboardBindingsFromOptions() { + bindKey(Action::LEFT, Options::controls.key_left); + bindKey(Action::RIGHT, Options::controls.key_right); + bindKey(Action::JUMP, Options::controls.key_jump); +} + // Asigna inputs a botones del mando void Input::bindGameControllerButton(const std::shared_ptr& gamepad, Action action, SDL_GamepadButton button) { if (gamepad != nullptr) { diff --git a/source/core/input/input.hpp b/source/core/input/input.hpp index 7769821..b0e1deb 100644 --- a/source/core/input/input.hpp +++ b/source/core/input/input.hpp @@ -121,6 +121,7 @@ class Input { // --- Métodos de configuración de controles --- void bindKey(Action action, SDL_Scancode code); + void applyKeyboardBindingsFromOptions(); // Aplica las teclas configuradas desde Options static void bindGameControllerButton(const std::shared_ptr& gamepad, Action action, SDL_GamepadButton button); static void bindGameControllerButton(const std::shared_ptr& gamepad, Action action_target, Action action_source); diff --git a/source/core/system/director.cpp b/source/core/system/director.cpp index c9990d4..0ce905c 100644 --- a/source/core/system/director.cpp +++ b/source/core/system/director.cpp @@ -140,6 +140,9 @@ Director::Director(std::vector const& args) { Input::init(Asset::get()->get("gamecontrollerdb.txt"), Asset::get()->get("controllers.json")); // Carga configuración de controles #endif + // Aplica las teclas configuradas desde Options + Input::get()->applyKeyboardBindingsFromOptions(); + Debug::init(); // Special handling for cheevos.bin - also needs filesystem path diff --git a/source/game/defaults.hpp b/source/game/defaults.hpp index 7980783..11942f6 100644 --- a/source/game/defaults.hpp +++ b/source/game/defaults.hpp @@ -7,26 +7,20 @@ // Forward declarations from Options namespace namespace Options { -enum class ControlScheme; +//enum class ControlScheme; enum class NotificationPosition; } // namespace Options namespace GameDefaults { -// ============================================================================= // GAME -// ============================================================================= constexpr int GAME_WIDTH = 256; // Ancho de la ventana por defecto constexpr int GAME_HEIGHT = 192; // Alto de la ventana por defecto -// ============================================================================= // WINDOW -// ============================================================================= constexpr int WINDOW_ZOOM = 2; // Zoom de la ventana por defecto -// ============================================================================= // VIDEO -// ============================================================================= constexpr bool VIDEO_MODE = false; // Modo de pantalla completa por defecto (false = ventana) constexpr ScreenFilter VIDEO_FILTER = ScreenFilter::NEAREST; // Filtro por defecto constexpr bool VIDEO_VERTICAL_SYNC = true; // Vsync activado por defecto @@ -35,16 +29,12 @@ constexpr bool VIDEO_INTEGER_SCALE = true; // Escalado entero constexpr bool VIDEO_KEEP_ASPECT = true; // Mantener aspecto activado por defecto constexpr const char* PALETTE_NAME = "zx-spectrum"; // Paleta por defecto -// ============================================================================= // BORDER -// ============================================================================= constexpr bool BORDER_ENABLED = true; // Borde activado por defecto constexpr int BORDER_WIDTH = 32; // Ancho del borde por defecto constexpr int BORDER_HEIGHT = 24; // Alto del borde por defecto -// ============================================================================= // AUDIO -// ============================================================================= constexpr float AUDIO_VOLUME = 1.0F; // Volumen por defecto constexpr bool AUDIO_ENABLED = true; // Audio por defecto @@ -56,15 +46,11 @@ constexpr bool MUSIC_ENABLED = true; // Musica habilitada por defecto constexpr float SOUND_VOLUME = 1.0F; // Volumen por defecto de los efectos de sonido constexpr bool SOUND_ENABLED = true; // Sonido habilitado por defecto -// ============================================================================= // NOTIFICATIONS -// ============================================================================= constexpr bool NOTIFICATION_SOUND = true; // Sonido de las notificaciones por defecto const Uint8 NOTIFICATION_COLOR = static_cast(PaletteColor::BLUE); // Color de las notificaciones por defecto -// ============================================================================= // OTHER -// ============================================================================= constexpr bool CONSOLE = false; // Consola desactivada por defecto constexpr const char* VERSION = "1.10"; // Versión por defecto diff --git a/source/game/options.cpp b/source/game/options.cpp index 54c4db1..98a9cf9 100644 --- a/source/game/options.cpp +++ b/source/game/options.cpp @@ -171,6 +171,14 @@ auto saveToFile(const std::string& file_path) -> bool { file << "# Paleta\n"; file << "video.palette " << video.palette << "\n"; + file << "\n## CONTROLS\n"; + file << "# Tecla para mover a la izquierda (SDL_Scancode)\n"; + file << "controls.left " << static_cast(controls.key_left) << "\n\n"; + file << "# Tecla para mover a la derecha (SDL_Scancode)\n"; + file << "controls.right " << static_cast(controls.key_right) << "\n\n"; + file << "# Tecla para saltar (SDL_Scancode)\n"; + file << "controls.jump " << static_cast(controls.key_jump) << "\n"; + // Cierra el fichero file.close(); @@ -224,6 +232,18 @@ auto setOptions(const std::string& var, const std::string& value) -> bool { }}, {"video.palette", [](const std::string& v) { video.palette = v; + }}, + {"controls.left", [](const std::string& v) { + int val = safeStoi(v, SDL_SCANCODE_LEFT); + controls.key_left = static_cast(val); + }}, + {"controls.right", [](const std::string& v) { + int val = safeStoi(v, SDL_SCANCODE_RIGHT); + controls.key_right = static_cast(val); + }}, + {"controls.jump", [](const std::string& v) { + int val = safeStoi(v, SDL_SCANCODE_UP); + controls.key_jump = static_cast(val); }}}; auto it = OPTION_HANDLERS.find(var); diff --git a/source/game/options.hpp b/source/game/options.hpp index 0850392..0ce1bd5 100644 --- a/source/game/options.hpp +++ b/source/game/options.hpp @@ -13,11 +13,13 @@ // --- Namespace Options: gestión de configuración y opciones del juego --- namespace Options { // Tipos de control de teclado +/* enum class ControlScheme { CURSOR, OPQA, WASD }; +*/ } // namespace Options @@ -40,6 +42,22 @@ struct Notification { color(c) {} }; +// Estructura para las opciones de control de teclado +struct ControlScheme { + SDL_Scancode key_left{SDL_SCANCODE_LEFT}; // Tecla para mover a la izquierda + SDL_Scancode key_right{SDL_SCANCODE_RIGHT}; // Tecla para mover a la derecha + SDL_Scancode key_jump{SDL_SCANCODE_UP}; // Tecla para saltar + + // Constructor por defecto + ControlScheme() = default; + + // Constructor + ControlScheme(SDL_Scancode left, SDL_Scancode right, SDL_Scancode jump) + : key_left(left), + key_right(right), + key_jump(jump) {} +}; + // Estructura para albergar trucos struct Cheat { enum class State : bool { @@ -215,7 +233,7 @@ inline Stats stats{}; // Datos con las estadisticas inline Notification notifications{}; // Opciones relativas a las notificaciones; inline Window window{}; // Opciones relativas a la ventana inline Audio audio{}; // Opciones relativas al audio -inline ControlScheme keys{ControlScheme::CURSOR}; // Teclas usadas para jugar +inline ControlScheme controls{}; // Teclas usadas para jugar // --- Funciones --- void init(); // Crea e inicializa las opciones del programa diff --git a/source/game/scenes/credits.cpp b/source/game/scenes/credits.cpp index bf21550..64ed192 100644 --- a/source/game/scenes/credits.cpp +++ b/source/game/scenes/credits.cpp @@ -57,8 +57,9 @@ void Credits::handleInput() { // Inicializa los textos void Credits::iniTexts() { - std::string keys; + std::string keys = "CURSORS"; + /* switch (Options::keys) { case Options::ControlScheme::CURSOR: keys = "CURSORS"; @@ -72,6 +73,7 @@ void Credits::iniTexts() { default: break; } + */ texts_.clear(); texts_.push_back({"", static_cast(PaletteColor::WHITE)});