- 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:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
@@ -147,6 +150,9 @@ protected:
|
||||
TypedArray<InputAxis2D> forward_back_events;
|
||||
TypedArray<InputAxis2D> up_down_events;
|
||||
|
||||
private:
|
||||
Vector3 last_axis_input = Vector3();
|
||||
|
||||
// Godot boilerplate below
|
||||
protected:
|
||||
static void _bind_methods()
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user