- 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
+40 -11
View File
@@ -46,17 +46,40 @@ void InputResource::update_axes(const float delta)
{
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 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;
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;
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;
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
{
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_DOWN_SUFFIX, this->axis_name + INPUTAXIS_UP_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
{
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_FORWARD_SUFFIX, this->axis_name + INPUTAXIS_BACK_SUFFIX
);
return axis.length() >= this->deadzone ? axis : Vector2();
}
Vector2 InputAxis::get_lateral_vector_square() const
{
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_FORWARD_SUFFIX, this->axis_name + INPUTAXIS_BACK_SUFFIX)
);
return axis.length() >= this->deadzone ? axis : Vector2();
}
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
{
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
{
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; }
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;
Vector2 get_lateral_vector() const;
@@ -146,6 +149,9 @@ protected:
TypedArray<InputAxis2D> left_right_events;
TypedArray<InputAxis2D> forward_back_events;
TypedArray<InputAxis2D> up_down_events;
private:
Vector3 last_axis_input = Vector3();
// Godot boilerplate below
protected:
+3 -4
View File
@@ -163,7 +163,7 @@ void InputHandler::add_input_resource(Node *target, InputResource *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())
{
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 &signal_name_pressed = callback_name_pressed + INPUTHANDLER_SUFFIX_SIGNAL;
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);
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))
{
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);
}
}
@@ -267,7 +267,6 @@ void InputHandler::remove_input_resource(Node *target, InputResource *resource)
*/
const StringName &axis_name = axis->get_axis_name();
const uint8_t &axis_dimensions = axis->get_axis_dimensions();
const float &deadzone = axis->get_deadzone();
if (axis_dimensions >= InputAxis::AXIS_DIMENSIONS::ONE)
{
const StringName &left_axis_action = axis_name + INPUTAXIS_LEFT_SUFFIX;