From eb550ab95bfc08e56d19e1b6a1a0529397432a84 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Sun, 2 Nov 2025 17:58:34 +0100 Subject: [PATCH] ja es poden redefinir les tecles renombrat achievements a projects --- source/game/scenes/title.cpp | 57 +++++++++++++++++++++--------------- source/game/scenes/title.hpp | 18 +++++++----- 2 files changed, 44 insertions(+), 31 deletions(-) diff --git a/source/game/scenes/title.cpp b/source/game/scenes/title.cpp index 8a6108dd..61ac2136 100644 --- a/source/game/scenes/title.cpp +++ b/source/game/scenes/title.cpp @@ -325,7 +325,17 @@ void Title::updateCheevosMenu(float delta_time) { void Title::updateControlsMenu(float delta_time) { // Actualiza la marquesina (sigue visible en fondo) updateMarquee(delta_time); - // No incrementar state_time_ (no timeout en este estado) + + // Si estamos mostrando las teclas definidas, esperar antes de guardar + if (controls_menu_state_ == ControlsMenuState::KEYBOARD_REMAP_COMPLETE) { + state_time_ += delta_time; + if (state_time_ >= KEYBOARD_REMAP_DISPLAY_DELAY) { + // Aplicar y guardar las teclas + applyKeyboardRemap(); + // Volver al menu principal + transitionToState(State::MAIN_MENU); + } + } } // Actualiza el estado FADE_MENU @@ -413,7 +423,7 @@ void Title::createCheevosTexture() { cheevos_surface_->clear(CHEEVOS_BG_COLOR); // Escribe la lista de logros en la textura - const std::string CHEEVOS_OWNER = "ACHIEVEMENTS"; + const std::string CHEEVOS_OWNER = "PROJECTS"; const std::string CHEEVOS_LIST_CAPTION = CHEEVOS_OWNER + " (" + std::to_string(Cheevos::get()->getTotalUnlockedAchievements()) + " / " + std::to_string(Cheevos::get()->size()) + ")"; int pos = 2; TEXT->writeDX(TEXT_CENTER | TEXT_COLOR, cheevos_surface_->getWidth() / 2, pos, CHEEVOS_LIST_CAPTION, 1, stringToColor("bright_green")); @@ -460,7 +470,7 @@ void Title::renderMainMenu() { const int TEXT_SIZE = menu_text_->getCharacterSize(); menu_text_->writeDX(TEXT_CENTER | TEXT_COLOR, PLAY_AREA_CENTER_X, 11 * TEXT_SIZE, "1. PLAY", 1, COLOR); menu_text_->writeDX(TEXT_CENTER | TEXT_COLOR, PLAY_AREA_CENTER_X, 13 * TEXT_SIZE, "2. CONTROLS", 1, COLOR); - menu_text_->writeDX(TEXT_CENTER | TEXT_COLOR, PLAY_AREA_CENTER_X, 15 * TEXT_SIZE, "3. ACHIEVEMENTS", 1, COLOR); + menu_text_->writeDX(TEXT_CENTER | TEXT_COLOR, PLAY_AREA_CENTER_X, 15 * TEXT_SIZE, "3. PROJECTS", 1, COLOR); } // Dibuja el menu de logros @@ -471,7 +481,8 @@ void Title::renderCheevosMenu() { // Dibuja el menu de controles void Title::renderControlsMenu() { // Delegar al render apropiado segun el subestado - if (controls_menu_state_ == ControlsMenuState::KEYBOARD_REMAP) { + if (controls_menu_state_ == ControlsMenuState::KEYBOARD_REMAP || + controls_menu_state_ == ControlsMenuState::KEYBOARD_REMAP_COMPLETE) { renderKeyboardRemap(); } else { // Menu principal de controles @@ -479,6 +490,7 @@ void Title::renderControlsMenu() { const int TEXT_SIZE = menu_text_->getCharacterSize(); menu_text_->writeDX(TEXT_CENTER | TEXT_COLOR, PLAY_AREA_CENTER_X, 11 * TEXT_SIZE, "1. REDEFINE KEYBOARD", 1, COLOR); menu_text_->writeDX(TEXT_CENTER | TEXT_COLOR, PLAY_AREA_CENTER_X, 13 * TEXT_SIZE, "2. REDEFINE JOYSTICK", 1, COLOR); + menu_text_->writeDX(TEXT_CENTER | TEXT_COLOR, PLAY_AREA_CENTER_X, 17 * TEXT_SIZE, "ENTER TO GO BACK", 1, COLOR); } } @@ -529,13 +541,6 @@ void Title::fillTitleSurface() { void Title::handleControlsMenuKeyboardRemap(const SDL_Event& event) { SDL_Scancode scancode = event.key.scancode; - // Si presiona ESC, cancela y vuelve al menu principal de controles - if (scancode == SDL_SCANCODE_ESCAPE) { - controls_menu_state_ = ControlsMenuState::MAIN; - remap_error_message_.clear(); - return; - } - // Valida la tecla if (!isKeyValid(scancode)) { remap_error_message_ = "INVALID KEY! TRY ANOTHER"; @@ -553,10 +558,10 @@ void Title::handleControlsMenuKeyboardRemap(const SDL_Event& event) { remap_error_message_.clear(); remap_step_++; - // Si completamos los 3 pasos, aplicar y guardar + // Si completamos los 3 pasos, mostrar resultado y esperar if (remap_step_ >= 3) { - applyKeyboardRemap(); - controls_menu_state_ = ControlsMenuState::MAIN; + controls_menu_state_ = ControlsMenuState::KEYBOARD_REMAP_COMPLETE; + state_time_ = 0.0F; // Resetear el timer para el delay de 1 segundo } } @@ -625,12 +630,16 @@ void Title::renderKeyboardRemap() { const int TEXT_SIZE = menu_text_->getCharacterSize(); // Titulo - menu_text_->writeDX(TEXT_CENTER | TEXT_COLOR, PLAY_AREA_CENTER_X, 9 * TEXT_SIZE, "REDEFINE KEYBOARD", 1, COLOR); + //menu_text_->writeDX(TEXT_CENTER | TEXT_COLOR, PLAY_AREA_CENTER_X, 9 * TEXT_SIZE, "REDEFINE KEYBOARD", 1, COLOR); - // Mensaje principal: "PRESS KEY FOR [ACTION]" - const std::string ACTION = getActionName(remap_step_); - const std::string MESSAGE = "PRESS KEY FOR " + ACTION; - menu_text_->writeDX(TEXT_CENTER | TEXT_COLOR, PLAY_AREA_CENTER_X, 12 * TEXT_SIZE, MESSAGE, 1, COLOR); + // Mensaje principal: "PRESS KEY FOR [ACTION]" o "KEYS DEFINED" si completado + if (remap_step_ >= 3) { + menu_text_->writeDX(TEXT_CENTER | TEXT_COLOR, PLAY_AREA_CENTER_X, 12 * TEXT_SIZE, "KEYS DEFINED", 1, COLOR); + } else { + const std::string ACTION = getActionName(remap_step_); + const std::string MESSAGE = "PRESS KEY FOR " + ACTION; + menu_text_->writeDX(TEXT_CENTER | TEXT_COLOR, PLAY_AREA_CENTER_X, 12 * TEXT_SIZE, MESSAGE, 1, COLOR); + } // Mostrar teclas ya capturadas if (remap_step_ > 0) { @@ -643,12 +652,14 @@ void Title::renderKeyboardRemap() { const std::string RIGHT_MSG = "RIGHT: " + RIGHT_KEY; menu_text_->writeDX(TEXT_CENTER | TEXT_COLOR, PLAY_AREA_CENTER_X, 15 * TEXT_SIZE, RIGHT_MSG, 1, COLOR); } + if (remap_step_ >= 3) { + const std::string JUMP_KEY = SDL_GetScancodeName(temp_keys_[2]); + const std::string JUMP_MSG = "JUMP: " + JUMP_KEY; + menu_text_->writeDX(TEXT_CENTER | TEXT_COLOR, PLAY_AREA_CENTER_X, 16 * TEXT_SIZE, JUMP_MSG, 1, COLOR); + } // Mensaje de error si existe if (!remap_error_message_.empty()) { - menu_text_->writeDX(TEXT_CENTER | TEXT_COLOR, PLAY_AREA_CENTER_X, 17 * TEXT_SIZE, remap_error_message_, 1, ERROR_COLOR); + menu_text_->writeDX(TEXT_CENTER | TEXT_COLOR, PLAY_AREA_CENTER_X, 18 * TEXT_SIZE, remap_error_message_, 1, ERROR_COLOR); } - - // Instrucciones para cancelar - menu_text_->writeDX(TEXT_CENTER | TEXT_COLOR, PLAY_AREA_CENTER_X, 19 * TEXT_SIZE, "(ESC TO CANCEL)", 1, COLOR); } \ No newline at end of file diff --git a/source/game/scenes/title.hpp b/source/game/scenes/title.hpp index 44b4c3fd..1a49eee2 100644 --- a/source/game/scenes/title.hpp +++ b/source/game/scenes/title.hpp @@ -41,17 +41,19 @@ class Title { }; enum class ControlsMenuState { - MAIN, // Mostrar menu principal de controles - KEYBOARD_REMAP, // Redefinir teclas del teclado - JOYSTICK_REMAP, // Redefinir botones del joystick (futuro) + MAIN, // Mostrar menu principal de controles + KEYBOARD_REMAP, // Redefinir teclas del teclado + KEYBOARD_REMAP_COMPLETE,// Mostrar teclas definidas antes de guardar + JOYSTICK_REMAP, // Redefinir botones del joystick (futuro) }; // --- Constantes de tiempo (en segundos) --- - static constexpr float SHOW_LOADING_DURATION = 5.0F; // Tiempo mostrando loading screen (antes 500 frames) - static constexpr float FADE_STEP_INTERVAL = 0.05F; // Intervalo entre pasos de fade (antes cada 4 frames) - static constexpr float POST_FADE_DELAY = 1.0F; // Delay después del fade (pantalla en negro) - static constexpr float MAIN_MENU_IDLE_TIMEOUT = 20.0F; // Timeout para ir a créditos (antes 2200 frames) - static constexpr float MARQUEE_SPEED = 100.0F; // Velocidad de marquesina (pixels/segundo) + static constexpr float SHOW_LOADING_DURATION = 5.0F; // Tiempo mostrando loading screen (antes 500 frames) + static constexpr float FADE_STEP_INTERVAL = 0.05F; // Intervalo entre pasos de fade (antes cada 4 frames) + static constexpr float POST_FADE_DELAY = 1.0F; // Delay después del fade (pantalla en negro) + static constexpr float MAIN_MENU_IDLE_TIMEOUT = 20.0F; // Timeout para ir a créditos (antes 2200 frames) + static constexpr float KEYBOARD_REMAP_DISPLAY_DELAY = 2.0F; // Tiempo mostrando teclas definidas antes de guardar + static constexpr float MARQUEE_SPEED = 100.0F; // Velocidad de marquesina (pixels/segundo) static constexpr float CHEEVOS_SCROLL_SPEED = 120.0F; // Velocidad de scroll de logros (pixels/segundo) // --- Constantes de marquesina ---