Fixed signal/function name confusion when adding and removing input resources.

This commit is contained in:
2026-08-23 17:48:44 -04:00
parent 323e55c3fd
commit 814299e449
3 changed files with 63 additions and 42 deletions
+9 -9
View File
@@ -26,8 +26,8 @@ void InputResource::update_buttons(const Ref<InputEvent> event, const float delt
if (event->is_action_pressed(action->get_action_name()) && action_strength >= action_deadzone)
{
action->set_active(true);
const StringName pressed_callback = StringName("_on_") + action->get_action_name() + INPUTACTION_SUFFIX_PRESSED;
if (this->has_signal(pressed_callback)) this->emit_signal(pressed_callback);
const StringName &pressed_signal = StringName("_on_") + action->get_action_name() + INPUTACTION_SUFFIX_PRESSED + INPUTHANDLER_SUFFIX_SIGNAL;
if (this->has_signal(pressed_signal)) this->emit_signal(pressed_signal);
}
}
else
@@ -35,8 +35,8 @@ void InputResource::update_buttons(const Ref<InputEvent> event, const float delt
if (event->is_action_released(action->get_action_name()) || (event->is_action_pressed(action->get_action_name()) && action_strength < action_deadzone))
{
action->set_active(false);
const StringName released_callback = StringName("_on_") + action->get_action_name() + INPUTACTION_SUFFIX_RELEASED;
if (this->has_signal(released_callback)) this->emit_signal(released_callback);
const StringName &released_signal = StringName("_on_") + action->get_action_name() + INPUTACTION_SUFFIX_RELEASED + INPUTHANDLER_SUFFIX_SIGNAL;
if (this->has_signal(released_signal)) this->emit_signal(released_signal);
}
}
}
@@ -49,13 +49,13 @@ void InputResource::update_axes(const float delta)
const InputAxis *axis = cast_to<InputAxis>(this->input_axes[i]);
const StringName prefix = StringName("_on_") + axis->get_axis_name();
const StringName signal_1d = prefix + INPUTAXIS_ONE_DIMENSIONAL_SUFFIX;
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());
const StringName signal_2d = prefix + INPUTAXIS_TWO_DIMENSIONAL_SUFFIX;
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());
const StringName signal_3d = prefix + INPUTAXIS_THREE_DIMENSIONAL_SUFFIX;
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());
}
}
@@ -65,10 +65,10 @@ void InputResource::update_axes_mouse_event(const Ref<InputEventMouseMotion> eve
for (uint8_t i = 0; i < this->input_axes.size(); i++)
{
const InputAxis *axis = cast_to<InputAxis>(this->input_axes[i]);
const StringName signal = StringName("_on_") + axis->get_axis_name() + INPUTAXIS_TWO_DIMENSIONAL_SUFFIX;
const StringName signal = StringName("_on_") + axis->get_axis_name() + INPUTAXIS_TWO_DIMENSIONAL_SUFFIX + INPUTHANDLER_SUFFIX_SIGNAL;
if (axis->get_include_mouse() && this->has_signal(signal))
{
this->emit_signal(signal, delta, event->get_relative() * 0.000001f / delta);
this->emit_signal(signal, delta, event->get_relative() * 0.0001f / delta);
}
}
}
+2
View File
@@ -13,6 +13,8 @@
#include <godot_cpp/classes/resource.hpp>
using namespace godot;
#define INPUTHANDLER_SUFFIX_SIGNAL StringName("_signal")
#define INPUTACTION_SUFFIX_PRESSED StringName("_pressed")
#define INPUTACTION_SUFFIX_RELEASED StringName("_released")
+48 -29
View File
@@ -55,14 +55,15 @@ void InputHandler::add_input_resource(Node *target, InputResource *resource)
for (uint8_t s = 0; s < 2; s++)
{
const StringName signal_name = StringName("_on_") + action->get_action_name() + this->input_action_suffixes[s];
if (target->has_method(signal_name))
const StringName callback_name = StringName("_on_") + action->get_action_name() + this->input_action_suffixes[s];
if (target->has_method(callback_name))
{
if (!resource->has_signal(signal_name))
{
resource->add_user_signal(signal_name);
resource->connect(signal_name, Callable(target, signal_name));
}
const StringName signal_name = callback_name + INPUTHANDLER_SUFFIX_SIGNAL;
if (!resource->has_signal(signal_name)) resource->add_user_signal(signal_name);
const Callable &callable = Callable(target, callback_name);
if (!resource->is_connected(signal_name, callable))
resource->connect(signal_name, callable);
const TypedArray<InputEvent> &events = action->get_input_events();
for (uint8_t e = 0; e < events.size(); e++)
@@ -83,12 +84,13 @@ void InputHandler::add_input_resource(Node *target, InputResource *resource)
for (uint8_t s = 0; s <= axis_dimensions; s++)
{
const StringName signal_name = StringName("_on_") + axis->get_axis_name() + this->input_axis_suffixes[s];
const Callable &callable = Callable(target, signal_name);
if (target->has_method(signal_name) && !resource->has_signal(signal_name))
const StringName callback_name = StringName("_on_") + axis->get_axis_name() + this->input_axis_suffixes[s];
if (target->has_method(callback_name))
{
resource->add_user_signal(signal_name);
resource->connect(signal_name, callable);
const StringName signal_name = callback_name + INPUTHANDLER_SUFFIX_SIGNAL;
if (!resource->has_signal(signal_name)) resource->add_user_signal(signal_name);
const Callable &callable = Callable(target, callback_name);
if (!resource->is_connected(signal_name, callable)) resource->connect(signal_name, callable);
}
}
@@ -183,12 +185,23 @@ void InputHandler::remove_input_resource(Node *target, InputResource *resource)
input->action_release(action->get_action_name());
input_map->action_erase_events(action->get_action_name());
const StringName signal_name_pressed = StringName("_on_") + action->get_action_name() + input_action_suffixes[0];
if (target->has_method(signal_name_pressed)) resource->disconnect(signal_name_pressed, Callable(target, signal_name_pressed));
const StringName &name_prefix = StringName("_on_") + action->get_action_name();
const StringName signal_name_released = StringName("_on_") + action->get_action_name() + input_action_suffixes[1];
if (target->has_method(signal_name_released)) resource->disconnect(signal_name_released, Callable(target, signal_name_released));
target->call(signal_name_released);
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))
resource->disconnect(signal_name_pressed, callable_pressed);
const StringName &callback_name_released = name_prefix + input_action_suffixes[1];
const StringName &signal_name_released = callback_name_released + INPUTHANDLER_SUFFIX_SIGNAL;
const Callable &callable_released = Callable(target, callback_name_released);
if (target->has_method(callback_name_released))
{
target->call(callback_name_released);
if (resource->is_connected(signal_name_released, callable_released))
resource->disconnect(signal_name_released, callable_released);
}
}
}
@@ -196,28 +209,34 @@ void InputHandler::remove_input_resource(Node *target, InputResource *resource)
{
if (const InputAxis *axis = cast_to<InputAxis>(input_axes[i]))
{
const StringName signal_name_one = StringName("_on_") + axis->get_axis_name() + this->input_axis_suffixes[0];
if (target->has_method(signal_name_one))
const StringName &callback_name_one = StringName("_on_") + axis->get_axis_name() + this->input_axis_suffixes[0];
const StringName &signal_name_one = callback_name_one + INPUTHANDLER_SUFFIX_SIGNAL;
if (target->has_method(callback_name_one))
{
if (resource->has_signal(signal_name_one))
resource->emit_signal(signal_name_one, this->get_process_delta_time(), 0.0f);
resource->disconnect(signal_name_one, Callable(target, signal_name_one));
resource->disconnect(signal_name_one, Callable(target, callback_name_one));
if (target->has_method(callback_name_one))
target->call(callback_name_one, this->get_process_delta_time(), 0.0f);
}
const StringName signal_name_two = StringName("_on_") + axis->get_axis_name() + this->input_axis_suffixes[1];
if (target->has_method(signal_name_two))
const StringName &callback_name_two = StringName("_on_") + axis->get_axis_name() + this->input_axis_suffixes[1];
const StringName &signal_name_two = callback_name_two + INPUTHANDLER_SUFFIX_SIGNAL;
if (target->has_method(callback_name_two))
{
if (resource->has_signal(signal_name_two))
resource->emit_signal(signal_name_two, this->get_process_delta_time(), Vector2(0.0f, 0.0f));
resource->disconnect(signal_name_two, Callable(target, signal_name_two));
resource->disconnect(signal_name_two, Callable(target, callback_name_two));
if (target->has_method(callback_name_two))
target->call(callback_name_two, this->get_process_delta_time(), Vector2(0.0f, 0.0f));
}
const StringName signal_name_three = StringName("_on_") + axis->get_axis_name() + this->input_axis_suffixes[2];
if (target->has_method(signal_name_three))
const StringName &callback_name_three = StringName("_on_") + axis->get_axis_name() + this->input_axis_suffixes[2];
const StringName &signal_name_three = callback_name_three + INPUTHANDLER_SUFFIX_SIGNAL;
if (target->has_method(callback_name_three))
{
if (resource->has_signal(signal_name_three))
resource->emit_signal(signal_name_three, this->get_process_delta_time(), Vector3(0.0f, 0.0f, 0.0f));
resource->disconnect(signal_name_three, Callable(target, signal_name_three));
resource->disconnect(signal_name_three, Callable(target, callback_name_three));
if (target->has_method(callback_name_three))
target->call(callback_name_three, this->get_process_delta_time(), Vector3(0.0f, 0.0f, 0.0f));
}
/*