Browse Source

Prevent axis-based actions from getting stuck

kobewi 2 years ago
parent
commit
a490fad82d
2 changed files with 27 additions and 5 deletions
  1. 26 5
      core/input/input.cpp
  2. 1 0
      core/input/input.h

+ 26 - 5
core/input/input.cpp

@@ -701,18 +701,39 @@ void Input::_parse_input_event_impl(const Ref<InputEvent> &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);
 			}

+ 1 - 0
core/input/input.h

@@ -104,6 +104,7 @@ private:
 		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;