- Inputs no longer fire continuously when the axis is in a resting position.

- Fixed an error that caused a signal that doesn't exist to disconnect.
This commit is contained in:
2026-08-29 15:52:58 -04:00
parent ad7281a47a
commit 1e43a2433c
3 changed files with 49 additions and 15 deletions
+39 -10
View File
@@ -46,17 +46,40 @@ void InputResource::update_axes(const float delta)
{ {
for (uint8_t i = 0; i < this->input_axes.size(); i++) for (uint8_t i = 0; i < this->input_axes.size(); i++)
{ {
const InputAxis *axis = cast_to<InputAxis>(this->input_axes[i]); InputAxis *axis = cast_to<InputAxis>(this->input_axes[i]);
const StringName prefix = StringName("_on_") + axis->get_axis_name(); const StringName prefix = StringName("_on_") + axis->get_axis_name();
const float axis_deadzone = axis->get_deadzone();
Vector3 current_input = axis->get_last_axis_input();
const StringName &signal_1d = prefix + INPUTAXIS_ONE_DIMENSIONAL_SUFFIX + INPUTHANDLER_SUFFIX_SIGNAL; const StringName &signal_1d = prefix + INPUTAXIS_ONE_DIMENSIONAL_SUFFIX + INPUTHANDLER_SUFFIX_SIGNAL;
if (this->has_signal(signal_1d)) this->emit_signal(signal_1d, delta, axis->get_x_axis()); if (this->has_signal(signal_1d))
{
const float x_axis = axis->get_x_axis();
if (current_input.x != x_axis || current_input.length() > SMALL_NUMBER)
this->emit_signal(signal_1d, delta, x_axis);
current_input.x = x_axis;
}
const StringName &signal_2d = prefix + INPUTAXIS_TWO_DIMENSIONAL_SUFFIX + INPUTHANDLER_SUFFIX_SIGNAL; const StringName &signal_2d = prefix + INPUTAXIS_TWO_DIMENSIONAL_SUFFIX + INPUTHANDLER_SUFFIX_SIGNAL;
if (this->has_signal(signal_2d)) this->emit_signal(signal_2d, delta, axis->get_lateral_vector()); if (this->has_signal(signal_2d))
{
const Vector2 &vector = axis->get_lateral_vector();
if ((current_input.x != vector.x || current_input.z != vector.y) || current_input.length() > SMALL_NUMBER)
this->emit_signal(signal_2d, delta, vector);
current_input.x = vector.x; current_input.z = vector.y;
}
const StringName &signal_3d = prefix + INPUTAXIS_THREE_DIMENSIONAL_SUFFIX + INPUTHANDLER_SUFFIX_SIGNAL; const StringName &signal_3d = prefix + INPUTAXIS_THREE_DIMENSIONAL_SUFFIX + INPUTHANDLER_SUFFIX_SIGNAL;
if (this->has_signal(signal_3d)) this->emit_signal(signal_3d, delta, axis->get_spherical_vector()); if (this->has_signal(signal_3d))
{
const Vector3 &vector = axis->get_spherical_vector();
if (current_input != vector || current_input.length() > SMALL_NUMBER)
this->emit_signal(signal_3d, delta, vector);
current_input = vector;
}
axis->set_last_axis_input(current_input);
} }
} }
@@ -104,42 +127,48 @@ Ref<InputAxis> InputResource::find_input_axis(const StringName &name) const
Vector3 InputAxis::get_spherical_vector() const Vector3 InputAxis::get_spherical_vector() const
{ {
const Input *input = Input::get_singleton(); const Input *input = Input::get_singleton();
return Vector3( const Vector3 &axis = Vector3(
input->get_axis(this->axis_name + INPUTAXIS_LEFT_SUFFIX, this->axis_name + INPUTAXIS_RIGHT_SUFFIX), input->get_axis(this->axis_name + INPUTAXIS_LEFT_SUFFIX, this->axis_name + INPUTAXIS_RIGHT_SUFFIX),
input->get_axis(this->axis_name + INPUTAXIS_DOWN_SUFFIX, this->axis_name + INPUTAXIS_UP_SUFFIX), input->get_axis(this->axis_name + INPUTAXIS_DOWN_SUFFIX, this->axis_name + INPUTAXIS_UP_SUFFIX),
input->get_axis(this->axis_name + INPUTAXIS_FORWARD_SUFFIX, this->axis_name + INPUTAXIS_BACK_SUFFIX) input->get_axis(this->axis_name + INPUTAXIS_FORWARD_SUFFIX, this->axis_name + INPUTAXIS_BACK_SUFFIX)
); );
return axis.length() >= this->deadzone ? axis : Vector3();
} }
Vector2 InputAxis::get_lateral_vector() const Vector2 InputAxis::get_lateral_vector() const
{ {
return Input::get_singleton()->get_vector( const Vector2 &axis = Input::get_singleton()->get_vector(
this->axis_name + INPUTAXIS_LEFT_SUFFIX, this->axis_name + INPUTAXIS_RIGHT_SUFFIX, this->axis_name + INPUTAXIS_LEFT_SUFFIX, this->axis_name + INPUTAXIS_RIGHT_SUFFIX,
this->axis_name + INPUTAXIS_FORWARD_SUFFIX, this->axis_name + INPUTAXIS_BACK_SUFFIX this->axis_name + INPUTAXIS_FORWARD_SUFFIX, this->axis_name + INPUTAXIS_BACK_SUFFIX
); );
return axis.length() >= this->deadzone ? axis : Vector2();
} }
Vector2 InputAxis::get_lateral_vector_square() const Vector2 InputAxis::get_lateral_vector_square() const
{ {
const Input *input = Input::get_singleton(); const Input *input = Input::get_singleton();
return Vector2( const Vector2 &axis = Vector2(
input->get_axis(this->axis_name + INPUTAXIS_LEFT_SUFFIX, this->axis_name + INPUTAXIS_RIGHT_SUFFIX), input->get_axis(this->axis_name + INPUTAXIS_LEFT_SUFFIX, this->axis_name + INPUTAXIS_RIGHT_SUFFIX),
input->get_axis(this->axis_name + INPUTAXIS_FORWARD_SUFFIX, this->axis_name + INPUTAXIS_BACK_SUFFIX) input->get_axis(this->axis_name + INPUTAXIS_FORWARD_SUFFIX, this->axis_name + INPUTAXIS_BACK_SUFFIX)
); );
return axis.length() >= this->deadzone ? axis : Vector2();
} }
float InputAxis::get_x_axis() const float InputAxis::get_x_axis() const
{ {
return Input::get_singleton()->get_axis(this->axis_name + INPUTAXIS_LEFT_SUFFIX, this->axis_name + INPUTAXIS_RIGHT_SUFFIX); const float axis = Input::get_singleton()->get_axis(this->axis_name + INPUTAXIS_LEFT_SUFFIX, this->axis_name + INPUTAXIS_RIGHT_SUFFIX);
return UtilityFunctions::absf(axis) >= this->deadzone ? axis : 0.0f;
} }
float InputAxis::get_y_axis() const float InputAxis::get_y_axis() const
{ {
return Input::get_singleton()->get_axis(this->axis_name + INPUTAXIS_DOWN_SUFFIX, this->axis_name + INPUTAXIS_UP_SUFFIX); const float axis = Input::get_singleton()->get_axis(this->axis_name + INPUTAXIS_DOWN_SUFFIX, this->axis_name + INPUTAXIS_UP_SUFFIX);
return UtilityFunctions::absf(axis) >= this->deadzone ? axis : 0.0f;
} }
float InputAxis::get_z_axis() const float InputAxis::get_z_axis() const
{ {
return Input::get_singleton()->get_axis(this->axis_name + INPUTAXIS_FORWARD_SUFFIX, this->axis_name + INPUTAXIS_BACK_SUFFIX); const float axis = Input::get_singleton()->get_axis(this->axis_name + INPUTAXIS_FORWARD_SUFFIX, this->axis_name + INPUTAXIS_BACK_SUFFIX);
return UtilityFunctions::absf(axis) >= this->deadzone ? axis : 0.0f;
} }
+6
View File
@@ -128,6 +128,9 @@ public:
void set_up_down_events(const TypedArray<InputAxis2D> events) { this->up_down_events = events; } void set_up_down_events(const TypedArray<InputAxis2D> events) { this->up_down_events = events; }
TypedArray<InputAxis2D> get_up_down_events() const { return this->up_down_events; } TypedArray<InputAxis2D> get_up_down_events() const { return this->up_down_events; }
void set_last_axis_input(const Vector3 &value) { this->last_axis_input = value; }
Vector3 get_last_axis_input() const { return this->last_axis_input; }
Vector3 get_spherical_vector() const; Vector3 get_spherical_vector() const;
Vector2 get_lateral_vector() const; Vector2 get_lateral_vector() const;
@@ -147,6 +150,9 @@ protected:
TypedArray<InputAxis2D> forward_back_events; TypedArray<InputAxis2D> forward_back_events;
TypedArray<InputAxis2D> up_down_events; TypedArray<InputAxis2D> up_down_events;
private:
Vector3 last_axis_input = Vector3();
// Godot boilerplate below // Godot boilerplate below
protected: protected:
static void _bind_methods() static void _bind_methods()
+3 -4
View File
@@ -163,7 +163,7 @@ void InputHandler::add_input_resource(Node *target, InputResource *resource)
this->active_resources.insert(resource); this->active_resources.insert(resource);
const StringName input_resource_method = target->get_name() + StringName("_") + resource->get_path(); const StringName &input_resource_method = target->get_name() + StringName("_") + resource->get_path();
if (this->bound_remove_methods.find(input_resource_method) == this->bound_remove_methods.end()) if (this->bound_remove_methods.find(input_resource_method) == this->bound_remove_methods.end())
{ {
MethodBind *bind = ClassDB::bind_method(input_resource_method, &InputHandler::remove_input_resource); MethodBind *bind = ClassDB::bind_method(input_resource_method, &InputHandler::remove_input_resource);
@@ -199,7 +199,7 @@ void InputHandler::remove_input_resource(Node *target, InputResource *resource)
const StringName &callback_name_pressed = name_prefix + input_action_suffixes[0]; const StringName &callback_name_pressed = name_prefix + input_action_suffixes[0];
const StringName &signal_name_pressed = callback_name_pressed + INPUTHANDLER_SUFFIX_SIGNAL; const StringName &signal_name_pressed = callback_name_pressed + INPUTHANDLER_SUFFIX_SIGNAL;
const Callable &callable_pressed = Callable(target, callback_name_pressed); const Callable &callable_pressed = Callable(target, callback_name_pressed);
if (resource->is_connected(signal_name_pressed, callable_pressed)) if (resource->has_signal(signal_name_pressed) && resource->is_connected(signal_name_pressed, callable_pressed))
resource->disconnect(signal_name_pressed, callable_pressed); resource->disconnect(signal_name_pressed, callable_pressed);
const StringName &callback_name_released = name_prefix + input_action_suffixes[1]; const StringName &callback_name_released = name_prefix + input_action_suffixes[1];
@@ -208,7 +208,7 @@ void InputHandler::remove_input_resource(Node *target, InputResource *resource)
if (target->has_method(callback_name_released)) if (target->has_method(callback_name_released))
{ {
target->call(callback_name_released); target->call(callback_name_released);
if (resource->is_connected(signal_name_released, callable_released)) if (resource->has_signal(signal_name_released) && resource->is_connected(signal_name_released, callable_released))
resource->disconnect(signal_name_released, callable_released); resource->disconnect(signal_name_released, callable_released);
} }
} }
@@ -267,7 +267,6 @@ void InputHandler::remove_input_resource(Node *target, InputResource *resource)
*/ */
const StringName &axis_name = axis->get_axis_name(); const StringName &axis_name = axis->get_axis_name();
const uint8_t &axis_dimensions = axis->get_axis_dimensions(); const uint8_t &axis_dimensions = axis->get_axis_dimensions();
const float &deadzone = axis->get_deadzone();
if (axis_dimensions >= InputAxis::AXIS_DIMENSIONS::ONE) if (axis_dimensions >= InputAxis::AXIS_DIMENSIONS::ONE)
{ {
const StringName &left_axis_action = axis_name + INPUTAXIS_LEFT_SUFFIX; const StringName &left_axis_action = axis_name + INPUTAXIS_LEFT_SUFFIX;