- 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++)
|
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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user