ja redefinix els botons i axis, pero el axis sempre te un comportament default. corregir
This commit is contained in:
@@ -36,7 +36,8 @@ Title::Title()
|
|||||||
fade_accumulator_(0.0F),
|
fade_accumulator_(0.0F),
|
||||||
exit_scene_(SceneManager::Scene::GAME),
|
exit_scene_(SceneManager::Scene::GAME),
|
||||||
controls_menu_state_(ControlsMenuState::MAIN),
|
controls_menu_state_(ControlsMenuState::MAIN),
|
||||||
remap_step_(0) {
|
remap_step_(0),
|
||||||
|
axis_cooldown_(0.0F) {
|
||||||
// Inicializa variables
|
// Inicializa variables
|
||||||
state_ = SceneManager::options == SceneManager::Options::TITLE_WITH_LOADING_SCREEN ? State::SHOW_LOADING_SCREEN : State::MAIN_MENU;
|
state_ = SceneManager::options == SceneManager::Options::TITLE_WITH_LOADING_SCREEN ? State::SHOW_LOADING_SCREEN : State::MAIN_MENU;
|
||||||
SceneManager::current = SceneManager::Scene::TITLE;
|
SceneManager::current = SceneManager::Scene::TITLE;
|
||||||
@@ -79,6 +80,14 @@ void Title::handleEvents() {
|
|||||||
while (SDL_PollEvent(&event)) {
|
while (SDL_PollEvent(&event)) {
|
||||||
GlobalEvents::handle(event);
|
GlobalEvents::handle(event);
|
||||||
|
|
||||||
|
// Manejo especial para captura de botones de gamepad
|
||||||
|
if (state_ == State::CONTROLS_MENU &&
|
||||||
|
controls_menu_state_ == ControlsMenuState::JOYSTICK_REMAP &&
|
||||||
|
(event.type == SDL_EVENT_GAMEPAD_BUTTON_DOWN || event.type == SDL_EVENT_GAMEPAD_AXIS_MOTION)) {
|
||||||
|
handleControlsMenuJoystickRemap(event);
|
||||||
|
continue; // No procesar más este evento
|
||||||
|
}
|
||||||
|
|
||||||
if (event.type == SDL_EVENT_KEY_DOWN) {
|
if (event.type == SDL_EVENT_KEY_DOWN) {
|
||||||
switch (state_) {
|
switch (state_) {
|
||||||
case State::MAIN_MENU:
|
case State::MAIN_MENU:
|
||||||
@@ -120,6 +129,7 @@ void Title::handleEvents() {
|
|||||||
controls_menu_state_ = ControlsMenuState::JOYSTICK_REMAP;
|
controls_menu_state_ = ControlsMenuState::JOYSTICK_REMAP;
|
||||||
remap_step_ = 0;
|
remap_step_ = 0;
|
||||||
remap_error_message_.clear();
|
remap_error_message_.clear();
|
||||||
|
axis_cooldown_ = 0.0F; // Resetear cooldown
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -129,9 +139,6 @@ void Title::handleEvents() {
|
|||||||
} else if (controls_menu_state_ == ControlsMenuState::KEYBOARD_REMAP) {
|
} else if (controls_menu_state_ == ControlsMenuState::KEYBOARD_REMAP) {
|
||||||
// Captura de teclas para redefinir
|
// Captura de teclas para redefinir
|
||||||
handleControlsMenuKeyboardRemap(event);
|
handleControlsMenuKeyboardRemap(event);
|
||||||
} else if (controls_menu_state_ == ControlsMenuState::JOYSTICK_REMAP) {
|
|
||||||
// Captura de botones del gamepad para redefinir
|
|
||||||
handleControlsMenuJoystickRemap(event);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -333,6 +340,14 @@ void Title::updateControlsMenu(float delta_time) {
|
|||||||
// Actualiza la marquesina (sigue visible en fondo)
|
// Actualiza la marquesina (sigue visible en fondo)
|
||||||
updateMarquee(delta_time);
|
updateMarquee(delta_time);
|
||||||
|
|
||||||
|
// Decrementar cooldown de ejes si estamos capturando botones
|
||||||
|
if (controls_menu_state_ == ControlsMenuState::JOYSTICK_REMAP && axis_cooldown_ > 0.0F) {
|
||||||
|
axis_cooldown_ -= delta_time;
|
||||||
|
if (axis_cooldown_ < 0.0F) {
|
||||||
|
axis_cooldown_ = 0.0F;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Si estamos mostrando las teclas definidas, esperar antes de guardar
|
// Si estamos mostrando las teclas definidas, esperar antes de guardar
|
||||||
if (controls_menu_state_ == ControlsMenuState::KEYBOARD_REMAP_COMPLETE) {
|
if (controls_menu_state_ == ControlsMenuState::KEYBOARD_REMAP_COMPLETE) {
|
||||||
state_time_ += delta_time;
|
state_time_ += delta_time;
|
||||||
@@ -736,21 +751,32 @@ void Title::handleControlsMenuJoystickRemap(const SDL_Event& event) {
|
|||||||
if (event.type == SDL_EVENT_GAMEPAD_BUTTON_DOWN) {
|
if (event.type == SDL_EVENT_GAMEPAD_BUTTON_DOWN) {
|
||||||
captured_button = static_cast<int>(event.gbutton.button);
|
captured_button = static_cast<int>(event.gbutton.button);
|
||||||
}
|
}
|
||||||
// Capturar triggers como botones (usando valores especiales 100/101)
|
// Capturar triggers y ejes analógicos
|
||||||
else if (event.type == SDL_EVENT_GAMEPAD_AXIS_MOTION) {
|
else if (event.type == SDL_EVENT_GAMEPAD_AXIS_MOTION) {
|
||||||
|
// Si el cooldown está activo, ignorar eventos de ejes (evita múltiples capturas)
|
||||||
|
if (axis_cooldown_ > 0.0F) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
constexpr Sint16 TRIGGER_THRESHOLD = 20000;
|
constexpr Sint16 TRIGGER_THRESHOLD = 20000;
|
||||||
|
constexpr Sint16 AXIS_THRESHOLD = 20000;
|
||||||
|
|
||||||
|
// Capturar triggers como botones (usando valores especiales 100/101)
|
||||||
if (event.gaxis.axis == SDL_GAMEPAD_AXIS_LEFT_TRIGGER && event.gaxis.value > TRIGGER_THRESHOLD) {
|
if (event.gaxis.axis == SDL_GAMEPAD_AXIS_LEFT_TRIGGER && event.gaxis.value > TRIGGER_THRESHOLD) {
|
||||||
captured_button = Input::TRIGGER_L2_AS_BUTTON; // 100
|
captured_button = Input::TRIGGER_L2_AS_BUTTON; // 100
|
||||||
|
axis_cooldown_ = 0.5F; // Cooldown de medio segundo
|
||||||
} else if (event.gaxis.axis == SDL_GAMEPAD_AXIS_RIGHT_TRIGGER && event.gaxis.value > TRIGGER_THRESHOLD) {
|
} else if (event.gaxis.axis == SDL_GAMEPAD_AXIS_RIGHT_TRIGGER && event.gaxis.value > TRIGGER_THRESHOLD) {
|
||||||
captured_button = Input::TRIGGER_R2_AS_BUTTON; // 101
|
captured_button = Input::TRIGGER_R2_AS_BUTTON; // 101
|
||||||
|
axis_cooldown_ = 0.5F;
|
||||||
}
|
}
|
||||||
// Capturar ejes del stick analógico (usando valores especiales 200+)
|
// Capturar ejes del stick analógico (usando valores especiales 200+)
|
||||||
else if (event.gaxis.axis == SDL_GAMEPAD_AXIS_LEFTX) {
|
else if (event.gaxis.axis == SDL_GAMEPAD_AXIS_LEFTX) {
|
||||||
constexpr Sint16 AXIS_THRESHOLD = 20000;
|
|
||||||
if (event.gaxis.value < -AXIS_THRESHOLD) {
|
if (event.gaxis.value < -AXIS_THRESHOLD) {
|
||||||
captured_button = 200; // Left stick izquierda
|
captured_button = 200; // Left stick izquierda
|
||||||
|
axis_cooldown_ = 0.5F;
|
||||||
} else if (event.gaxis.value > AXIS_THRESHOLD) {
|
} else if (event.gaxis.value > AXIS_THRESHOLD) {
|
||||||
captured_button = 201; // Left stick derecha
|
captured_button = 201; // Left stick derecha
|
||||||
|
axis_cooldown_ = 0.5F;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -92,6 +92,7 @@ class Title {
|
|||||||
SDL_Scancode temp_keys_[3]; // Almacenamiento temporal de teclas capturadas
|
SDL_Scancode temp_keys_[3]; // Almacenamiento temporal de teclas capturadas
|
||||||
int temp_buttons_[3]; // Almacenamiento temporal de botones de gamepad capturados
|
int temp_buttons_[3]; // Almacenamiento temporal de botones de gamepad capturados
|
||||||
std::string remap_error_message_; // Mensaje de error si la tecla/boton es invalido
|
std::string remap_error_message_; // Mensaje de error si la tecla/boton es invalido
|
||||||
|
float axis_cooldown_; // Cooldown para evitar múltiples capturas de ejes
|
||||||
|
|
||||||
// --- Funciones ---
|
// --- Funciones ---
|
||||||
void update(); // Actualiza las variables
|
void update(); // Actualiza las variables
|
||||||
|
|||||||
Reference in New Issue
Block a user