From a490fad82d5fc772174b4363092923f00b11f7a6 Mon Sep 17 00:00:00 2001 From: kobewi Date: Wed, 30 Aug 2023 17:17:30 +0200 Subject: [PATCH] Prevent axis-based actions from getting stuck --- core/input/input.cpp | 31 ++++++++++++++++++++++++++----- core/input/input.h | 1 + 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/core/input/input.cpp b/core/input/input.cpp index e89c71d7620f..19ea8c73170f 100644 --- a/core/input/input.cpp +++ b/core/input/input.cpp @@ -701,18 +701,39 @@ void Input::_parse_input_event_impl(const Ref &p_event, bool p_is_em if (!p_event->is_echo()) { if (p_event->is_action_pressed(E.key)) { - action.pressed++; + if (jm.is_valid()) { + // If axis is already pressed, don't increase the pressed counter. + if (!action.axis_pressed) { + action.pressed++; + action.axis_pressed = true; + } + } else { + action.pressed++; + } + is_pressed = true; if (action.pressed == 1) { action.pressed_physics_frame = Engine::get_singleton()->get_physics_frames(); action.pressed_process_frame = Engine::get_singleton()->get_process_frames(); } } else { - if (action.pressed == 1) { - action.released_physics_frame = Engine::get_singleton()->get_physics_frames(); - action.released_process_frame = Engine::get_singleton()->get_process_frames(); + bool is_released = true; + if (jm.is_valid()) { + // Same as above. Don't release axis when not pressed. + if (action.axis_pressed) { + action.axis_pressed = false; + } else { + is_released = false; + } + } + + if (is_released) { + if (action.pressed == 1) { + action.released_physics_frame = Engine::get_singleton()->get_physics_frames(); + action.released_process_frame = Engine::get_singleton()->get_process_frames(); + } + action.pressed = MAX(action.pressed - 1, 0); } - action.pressed = MAX(action.pressed - 1, 0); } action.exact = InputMap::get_singleton()->event_is_action(p_event, E.key, true); } diff --git a/core/input/input.h b/core/input/input.h index 26466bdeadea..8ce5f64a6acd 100644 --- a/core/input/input.h +++ b/core/input/input.h @@ -104,6 +104,7 @@ class Input : public Object { uint64_t released_physics_frame = UINT64_MAX; uint64_t released_process_frame = UINT64_MAX; int pressed = 0; + bool axis_pressed = false; bool exact = true; float strength = 0.0f; float raw_strength = 0.0f;