|
@@ -149,6 +149,9 @@ void Input::_bind_methods() {
|
|
|
ClassDB::bind_method(D_METHOD("is_action_just_pressed", "action"), &Input::is_action_just_pressed);
|
|
|
ClassDB::bind_method(D_METHOD("is_action_just_released", "action"), &Input::is_action_just_released);
|
|
|
ClassDB::bind_method(D_METHOD("get_action_strength", "action"), &Input::get_action_strength);
|
|
|
+ ClassDB::bind_method(D_METHOD("get_action_raw_strength", "action"), &Input::get_action_strength);
|
|
|
+ ClassDB::bind_method(D_METHOD("get_axis", "negative_action", "positive_action"), &Input::get_axis);
|
|
|
+ ClassDB::bind_method(D_METHOD("get_vector", "negative_x", "positive_x", "negative_y", "positive_y", "deadzone"), &Input::get_vector, DEFVAL(-1.0f));
|
|
|
ClassDB::bind_method(D_METHOD("add_joy_mapping", "mapping", "update_existing"), &Input::add_joy_mapping, DEFVAL(false));
|
|
|
ClassDB::bind_method(D_METHOD("remove_joy_mapping", "guid"), &Input::remove_joy_mapping);
|
|
|
ClassDB::bind_method(D_METHOD("joy_connection_changed", "device", "connected", "name", "guid"), &Input::joy_connection_changed);
|
|
@@ -215,7 +218,9 @@ void Input::get_argument_options(const StringName &p_function, int p_idx, List<S
|
|
|
const String quote_style = EDITOR_DEF("text_editor/completion/use_single_quotes", 0) ? "'" : "\"";
|
|
|
|
|
|
String pf = p_function;
|
|
|
- if (p_idx == 0 && (pf == "is_action_pressed" || pf == "action_press" || pf == "action_release" || pf == "is_action_just_pressed" || pf == "is_action_just_released" || pf == "get_action_strength")) {
|
|
|
+ if (p_idx == 0 && (pf == "is_action_pressed" || pf == "action_press" || pf == "action_release" ||
|
|
|
+ pf == "is_action_just_pressed" || pf == "is_action_just_released" ||
|
|
|
+ pf == "get_action_strength" || pf == "get_axis" || pf == "get_vector")) {
|
|
|
List<PropertyInfo> pinfo;
|
|
|
ProjectSettings::get_singleton()->get_property_list(&pinfo);
|
|
|
|
|
@@ -335,6 +340,37 @@ float Input::get_action_raw_strength(const StringName &p_action) const {
|
|
|
return E->get().raw_strength;
|
|
|
}
|
|
|
|
|
|
+float Input::get_axis(const StringName &p_negative_action, const StringName &p_positive_action) const {
|
|
|
+ return get_action_strength(p_positive_action) - get_action_strength(p_negative_action);
|
|
|
+}
|
|
|
+
|
|
|
+Vector2 Input::get_vector(const StringName &p_negative_x, const StringName &p_positive_x, const StringName &p_negative_y, const StringName &p_positive_y, float p_deadzone) const {
|
|
|
+ Vector2 vector = Vector2(
|
|
|
+ get_action_raw_strength(p_positive_x) - get_action_raw_strength(p_negative_x),
|
|
|
+ get_action_raw_strength(p_positive_y) - get_action_raw_strength(p_negative_y));
|
|
|
+
|
|
|
+ if (p_deadzone < 0.0f) {
|
|
|
+ // If the deadzone isn't specified, get it from the average of the actions.
|
|
|
+ p_deadzone = (InputMap::get_singleton()->action_get_deadzone(p_positive_x) +
|
|
|
+ InputMap::get_singleton()->action_get_deadzone(p_negative_x) +
|
|
|
+ InputMap::get_singleton()->action_get_deadzone(p_positive_y) +
|
|
|
+ InputMap::get_singleton()->action_get_deadzone(p_negative_y)) /
|
|
|
+ 4;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Circular length limiting and deadzone.
|
|
|
+ float length = vector.length();
|
|
|
+ if (length <= p_deadzone) {
|
|
|
+ return Vector2();
|
|
|
+ } else if (length > 1.0f) {
|
|
|
+ return vector / length;
|
|
|
+ } else {
|
|
|
+ // Inverse lerp length to map (p_deadzone, 1) to (0, 1).
|
|
|
+ return vector * (Math::inverse_lerp(p_deadzone, 1.0f, length) / length);
|
|
|
+ }
|
|
|
+ return vector;
|
|
|
+}
|
|
|
+
|
|
|
float Input::get_joy_axis(int p_device, int p_axis) const {
|
|
|
_THREAD_SAFE_METHOD_
|
|
|
int c = _combine_device(p_axis, p_device);
|