Skip to content

Commit 9dca687

Browse files
committed
Support Input and UI for multiple players
1 parent 1586c56 commit 9dca687

28 files changed

+449
-102
lines changed

core/config/project_settings.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -545,6 +545,7 @@ void ProjectSettings::_convert_to_last_version(int p_from_version) {
545545
Ref<InputEvent> ev = events[i];
546546
if (ev.is_valid() && ev->get_device() == -3) {
547547
ev->set_device(-1);
548+
ev->set_player_from_device();
548549
}
549550
}
550551
}
@@ -759,6 +760,12 @@ Error ProjectSettings::setup(const String &p_path, const String &p_main_pack, bo
759760

760761
load_scene_groups_cache();
761762

763+
// FIXME: Temp device_player_map population.
764+
device_player_map[0] = PlayerId::P1;
765+
device_player_map[1] = PlayerId::P2;
766+
device_player_map[2] = PlayerId::P3;
767+
device_player_map[3] = PlayerId::P4;
768+
762769
project_loaded = err == OK;
763770
return err;
764771
}

core/config/project_settings.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ class ProjectSettings : public Object {
9393
HashMap<StringName, PropertyInfo> custom_prop_info;
9494
bool using_datapack = false;
9595
bool project_loaded = false;
96+
HashMap<int, PlayerId> device_player_map;
9697
List<String> input_presets;
9798

9899
HashSet<String> custom_features;
@@ -191,6 +192,7 @@ class ProjectSettings : public Object {
191192
const HashMap<StringName, PropertyInfo> &get_custom_property_info() const;
192193
uint64_t get_last_saved_time() { return last_save_time; }
193194

195+
HashMap<int, PlayerId> get_device_player_map() const { return device_player_map; }
194196
List<String> get_input_presets() const { return input_presets; }
195197

196198
Variant get_setting_with_override(const StringName &p_name) const;

core/core_constants.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -527,6 +527,15 @@ void register_global_constants() {
527527
BIND_CORE_BITFIELD_CLASS_FLAG(MouseButtonMask, MOUSE_BUTTON_MASK, MB_XBUTTON1);
528528
BIND_CORE_BITFIELD_CLASS_FLAG(MouseButtonMask, MOUSE_BUTTON_MASK, MB_XBUTTON2);
529529

530+
BIND_CORE_ENUM_CLASS_CONSTANT(PlayerId, PLAYER_ID, P1);
531+
BIND_CORE_ENUM_CLASS_CONSTANT(PlayerId, PLAYER_ID, P2);
532+
BIND_CORE_ENUM_CLASS_CONSTANT(PlayerId, PLAYER_ID, P3);
533+
BIND_CORE_ENUM_CLASS_CONSTANT(PlayerId, PLAYER_ID, P4);
534+
BIND_CORE_ENUM_CLASS_CONSTANT(PlayerId, PLAYER_ID, P5);
535+
BIND_CORE_ENUM_CLASS_CONSTANT(PlayerId, PLAYER_ID, P6);
536+
BIND_CORE_ENUM_CLASS_CONSTANT(PlayerId, PLAYER_ID, P7);
537+
BIND_CORE_ENUM_CLASS_CONSTANT(PlayerId, PLAYER_ID, P8);
538+
530539
BIND_CORE_ENUM_CLASS_CONSTANT(JoyButton, JOY_BUTTON, INVALID);
531540
BIND_CORE_ENUM_CLASS_CONSTANT(JoyButton, JOY_BUTTON, A);
532541
BIND_CORE_ENUM_CLASS_CONSTANT(JoyButton, JOY_BUTTON, B);
@@ -649,6 +658,7 @@ void register_global_constants() {
649658
BIND_CORE_ENUM_CONSTANT(PROPERTY_HINT_LAYERS_3D_PHYSICS);
650659
BIND_CORE_ENUM_CONSTANT(PROPERTY_HINT_LAYERS_3D_NAVIGATION);
651660
BIND_CORE_ENUM_CONSTANT(PROPERTY_HINT_LAYERS_AVOIDANCE);
661+
BIND_CORE_ENUM_CONSTANT(PROPERTY_HINT_LAYERS_PLAYER_MASK);
652662

653663
BIND_CORE_ENUM_CONSTANT(PROPERTY_HINT_FILE);
654664
BIND_CORE_ENUM_CONSTANT(PROPERTY_HINT_DIR);

core/input/input.cpp

Lines changed: 66 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -122,13 +122,13 @@ void Input::_bind_methods() {
122122
ClassDB::bind_method(D_METHOD("is_key_label_pressed", "keycode"), &Input::is_key_label_pressed);
123123
ClassDB::bind_method(D_METHOD("is_mouse_button_pressed", "button"), &Input::is_mouse_button_pressed);
124124
ClassDB::bind_method(D_METHOD("is_joy_button_pressed", "device", "button"), &Input::is_joy_button_pressed);
125-
ClassDB::bind_method(D_METHOD("is_action_pressed", "action", "exact_match"), &Input::is_action_pressed, DEFVAL(false));
126-
ClassDB::bind_method(D_METHOD("is_action_just_pressed", "action", "exact_match"), &Input::is_action_just_pressed, DEFVAL(false));
127-
ClassDB::bind_method(D_METHOD("is_action_just_released", "action", "exact_match"), &Input::is_action_just_released, DEFVAL(false));
128-
ClassDB::bind_method(D_METHOD("get_action_strength", "action", "exact_match"), &Input::get_action_strength, DEFVAL(false));
129-
ClassDB::bind_method(D_METHOD("get_action_raw_strength", "action", "exact_match"), &Input::get_action_raw_strength, DEFVAL(false));
130-
ClassDB::bind_method(D_METHOD("get_axis", "negative_action", "positive_action"), &Input::get_axis);
131-
ClassDB::bind_method(D_METHOD("get_vector", "negative_x", "positive_x", "negative_y", "positive_y", "deadzone"), &Input::get_vector, DEFVAL(-1.0f));
125+
ClassDB::bind_method(D_METHOD("is_action_pressed", "action", "exact_match", "player_mask"), &Input::is_action_pressed, DEFVAL(false), DEFVAL(PLAYER_ALL));
126+
ClassDB::bind_method(D_METHOD("is_action_just_pressed", "action", "exact_match", "player_mask"), &Input::is_action_just_pressed, DEFVAL(false), DEFVAL(PLAYER_ALL));
127+
ClassDB::bind_method(D_METHOD("is_action_just_released", "action", "exact_match", "player_mask"), &Input::is_action_just_released, DEFVAL(false), DEFVAL(PLAYER_ALL));
128+
ClassDB::bind_method(D_METHOD("get_action_strength", "action", "exact_match", "player_mask"), &Input::get_action_strength, DEFVAL(false), DEFVAL(PLAYER_ALL));
129+
ClassDB::bind_method(D_METHOD("get_action_raw_strength", "action", "exact_match", "player_mask"), &Input::get_action_raw_strength, DEFVAL(false), DEFVAL(PLAYER_ALL));
130+
ClassDB::bind_method(D_METHOD("get_axis", "negative_action", "positive_action", "player_mask"), &Input::get_axis, DEFVAL(PLAYER_ALL));
131+
ClassDB::bind_method(D_METHOD("get_vector", "negative_x", "positive_x", "negative_y", "positive_y", "deadzone", "player_mask"), &Input::get_vector, DEFVAL(-1.0f), DEFVAL(PLAYER_ALL));
132132
ClassDB::bind_method(D_METHOD("add_joy_mapping", "mapping", "update_existing"), &Input::add_joy_mapping, DEFVAL(false));
133133
ClassDB::bind_method(D_METHOD("remove_joy_mapping", "guid"), &Input::remove_joy_mapping);
134134
ClassDB::bind_method(D_METHOD("is_joy_known", "device"), &Input::is_joy_known);
@@ -157,8 +157,8 @@ void Input::_bind_methods() {
157157
ClassDB::bind_method(D_METHOD("set_mouse_mode", "mode"), &Input::set_mouse_mode);
158158
ClassDB::bind_method(D_METHOD("get_mouse_mode"), &Input::get_mouse_mode);
159159
ClassDB::bind_method(D_METHOD("warp_mouse", "position"), &Input::warp_mouse);
160-
ClassDB::bind_method(D_METHOD("action_press", "action", "strength"), &Input::action_press, DEFVAL(1.f));
161-
ClassDB::bind_method(D_METHOD("action_release", "action"), &Input::action_release);
160+
ClassDB::bind_method(D_METHOD("action_press", "action", "strength", "player_mask"), &Input::action_press, DEFVAL(1.f), DEFVAL(PlayerMask::PLAYER_ALL));
161+
ClassDB::bind_method(D_METHOD("action_release", "action", "player_mask"), &Input::action_release, DEFVAL(PlayerMask::PLAYER_ALL));
162162
ClassDB::bind_method(D_METHOD("set_default_cursor_shape", "shape"), &Input::set_default_cursor_shape, DEFVAL(CURSOR_ARROW));
163163
ClassDB::bind_method(D_METHOD("get_current_cursor_shape"), &Input::get_current_cursor_shape);
164164
ClassDB::bind_method(D_METHOD("set_custom_mouse_cursor", "image", "shape", "hotspot"), &Input::set_custom_mouse_cursor, DEFVAL(CURSOR_ARROW), DEFVAL(Vector2()));
@@ -201,6 +201,19 @@ void Input::_bind_methods() {
201201
BIND_ENUM_CONSTANT(CURSOR_HSPLIT);
202202
BIND_ENUM_CONSTANT(CURSOR_HELP);
203203

204+
BIND_CONSTANT(PLAYERS_MAX);
205+
206+
BIND_BITFIELD_FLAG(PLAYER_NONE);
207+
BIND_BITFIELD_FLAG(PLAYER_1);
208+
BIND_BITFIELD_FLAG(PLAYER_2);
209+
BIND_BITFIELD_FLAG(PLAYER_3);
210+
BIND_BITFIELD_FLAG(PLAYER_4);
211+
BIND_BITFIELD_FLAG(PLAYER_5);
212+
BIND_BITFIELD_FLAG(PLAYER_6);
213+
BIND_BITFIELD_FLAG(PLAYER_7);
214+
BIND_BITFIELD_FLAG(PLAYER_8);
215+
BIND_BITFIELD_FLAG(PLAYER_ALL);
216+
204217
ADD_SIGNAL(MethodInfo("joy_connection_changed", PropertyInfo(Variant::INT, "device"), PropertyInfo(Variant::BOOL, "connected")));
205218
}
206219

@@ -369,7 +382,7 @@ bool Input::is_joy_button_pressed(int p_device, JoyButton p_button) const {
369382
return joy_buttons_pressed.has(_combine_device(p_button, p_device));
370383
}
371384

372-
bool Input::is_action_pressed(const StringName &p_action, bool p_exact) const {
385+
bool Input::is_action_pressed(const StringName &p_action, bool p_exact, BitField<PlayerMask> p_player_mask) const {
373386
ERR_FAIL_COND_V_MSG(!InputMap::get_singleton()->has_action(p_action), false, InputMap::get_singleton()->suggest_actions(p_action));
374387

375388
if (disable_input) {
@@ -381,10 +394,10 @@ bool Input::is_action_pressed(const StringName &p_action, bool p_exact) const {
381394
return false;
382395
}
383396

384-
return E->value.cache.pressed && (p_exact ? E->value.exact : true);
397+
return E->value.cache.pressed && (p_exact ? E->value.exact : true) && p_player_mask & E->value.player_mask;
385398
}
386399

387-
bool Input::is_action_just_pressed(const StringName &p_action, bool p_exact) const {
400+
bool Input::is_action_just_pressed(const StringName &p_action, bool p_exact, BitField<PlayerMask> p_player_mask) const {
388401
ERR_FAIL_COND_V_MSG(!InputMap::get_singleton()->has_action(p_action), false, InputMap::get_singleton()->suggest_actions(p_action));
389402

390403
if (disable_input) {
@@ -400,6 +413,10 @@ bool Input::is_action_just_pressed(const StringName &p_action, bool p_exact) con
400413
return false;
401414
}
402415

416+
if (!(p_player_mask & E->value.player_mask)) {
417+
return false;
418+
}
419+
403420
// Backward compatibility for legacy behavior, only return true if currently pressed.
404421
bool pressed_requirement = legacy_just_pressed_behavior ? E->value.cache.pressed : true;
405422

@@ -410,7 +427,7 @@ bool Input::is_action_just_pressed(const StringName &p_action, bool p_exact) con
410427
}
411428
}
412429

413-
bool Input::is_action_just_released(const StringName &p_action, bool p_exact) const {
430+
bool Input::is_action_just_released(const StringName &p_action, bool p_exact, BitField<PlayerMask> p_player_mask) const {
414431
ERR_FAIL_COND_V_MSG(!InputMap::get_singleton()->has_action(p_action), false, InputMap::get_singleton()->suggest_actions(p_action));
415432

416433
if (disable_input) {
@@ -426,6 +443,10 @@ bool Input::is_action_just_released(const StringName &p_action, bool p_exact) co
426443
return false;
427444
}
428445

446+
if (!(p_player_mask & E->value.player_mask)) {
447+
return false;
448+
}
449+
429450
// Backward compatibility for legacy behavior, only return true if currently released.
430451
bool released_requirement = legacy_just_pressed_behavior ? !E->value.cache.pressed : true;
431452

@@ -436,7 +457,7 @@ bool Input::is_action_just_released(const StringName &p_action, bool p_exact) co
436457
}
437458
}
438459

439-
float Input::get_action_strength(const StringName &p_action, bool p_exact) const {
460+
float Input::get_action_strength(const StringName &p_action, bool p_exact, BitField<PlayerMask> p_player_mask) const {
440461
ERR_FAIL_COND_V_MSG(!InputMap::get_singleton()->has_action(p_action), 0.0, InputMap::get_singleton()->suggest_actions(p_action));
441462

442463
if (disable_input) {
@@ -452,10 +473,14 @@ float Input::get_action_strength(const StringName &p_action, bool p_exact) const
452473
return 0.0f;
453474
}
454475

476+
if (!(p_player_mask & E->value.player_mask)) {
477+
return 0.0f;
478+
}
479+
455480
return E->value.cache.strength;
456481
}
457482

458-
float Input::get_action_raw_strength(const StringName &p_action, bool p_exact) const {
483+
float Input::get_action_raw_strength(const StringName &p_action, bool p_exact, BitField<PlayerMask> p_player_mask) const {
459484
ERR_FAIL_COND_V_MSG(!InputMap::get_singleton()->has_action(p_action), 0.0, InputMap::get_singleton()->suggest_actions(p_action));
460485

461486
if (disable_input) {
@@ -471,17 +496,21 @@ float Input::get_action_raw_strength(const StringName &p_action, bool p_exact) c
471496
return 0.0f;
472497
}
473498

499+
if (!(p_player_mask & E->value.player_mask)) {
500+
return 0.0f;
501+
}
502+
474503
return E->value.cache.raw_strength;
475504
}
476505

477-
float Input::get_axis(const StringName &p_negative_action, const StringName &p_positive_action) const {
478-
return get_action_strength(p_positive_action) - get_action_strength(p_negative_action);
506+
float Input::get_axis(const StringName &p_negative_action, const StringName &p_positive_action, BitField<PlayerMask> p_player_mask) const {
507+
return get_action_strength(p_positive_action, false, p_player_mask) - get_action_strength(p_negative_action, false, p_player_mask);
479508
}
480509

481-
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 {
510+
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, BitField<PlayerMask> p_player_mask) const {
482511
Vector2 vector = Vector2(
483-
get_action_raw_strength(p_positive_x) - get_action_raw_strength(p_negative_x),
484-
get_action_raw_strength(p_positive_y) - get_action_raw_strength(p_negative_y));
512+
get_action_raw_strength(p_positive_x, false, p_player_mask) - get_action_raw_strength(p_negative_x, false, p_player_mask),
513+
get_action_raw_strength(p_positive_y, false, p_player_mask) - get_action_raw_strength(p_negative_y, false, p_player_mask));
485514

486515
if (p_deadzone < 0.0f) {
487516
// If the deadzone isn't specified, get it from the average of the actions.
@@ -711,11 +740,14 @@ void Input::_parse_input_event_impl(const Ref<InputEvent> &p_event, bool p_is_em
711740
if (event_dispatch_function && emulate_touch_from_mouse && !p_is_emulated && mb->get_button_index() == MouseButton::LEFT) {
712741
Ref<InputEventScreenTouch> touch_event;
713742
touch_event.instantiate();
743+
714744
touch_event->set_pressed(mb->is_pressed());
715745
touch_event->set_canceled(mb->is_canceled());
716746
touch_event->set_position(mb->get_position());
717747
touch_event->set_double_tap(mb->is_double_click());
718748
touch_event->set_device(InputEvent::DEVICE_ID_EMULATION);
749+
touch_event->set_player_from_device();
750+
719751
_THREAD_SAFE_UNLOCK_
720752
event_dispatch_function(touch_event);
721753
_THREAD_SAFE_LOCK_
@@ -746,6 +778,7 @@ void Input::_parse_input_event_impl(const Ref<InputEvent> &p_event, bool p_is_em
746778
drag_event->set_velocity(get_last_mouse_velocity());
747779
drag_event->set_screen_velocity(get_last_mouse_screen_velocity());
748780
drag_event->set_device(InputEvent::DEVICE_ID_EMULATION);
781+
drag_event->set_player_from_device();
749782

750783
_THREAD_SAFE_UNLOCK_
751784
event_dispatch_function(drag_event);
@@ -784,6 +817,7 @@ void Input::_parse_input_event_impl(const Ref<InputEvent> &p_event, bool p_is_em
784817
button_event.instantiate();
785818

786819
button_event->set_device(InputEvent::DEVICE_ID_EMULATION);
820+
button_event->set_player_from_device();
787821
button_event->set_position(st->get_position());
788822
button_event->set_global_position(st->get_position());
789823
button_event->set_pressed(st->is_pressed());
@@ -818,6 +852,7 @@ void Input::_parse_input_event_impl(const Ref<InputEvent> &p_event, bool p_is_em
818852
motion_event.instantiate();
819853

820854
motion_event->set_device(InputEvent::DEVICE_ID_EMULATION);
855+
motion_event->set_player_from_device();
821856
motion_event->set_tilt(sd->get_tilt());
822857
motion_event->set_pen_inverted(sd->get_pen_inverted());
823858
motion_event->set_pressure(sd->get_pressure());
@@ -879,6 +914,9 @@ void Input::_parse_input_event_impl(const Ref<InputEvent> &p_event, bool p_is_em
879914
device_state.strength[event_index] = p_event->get_action_strength(E.key);
880915
device_state.raw_strength[event_index] = p_event->get_action_raw_strength(E.key);
881916

917+
// TODO: Not sure.
918+
// uint32_t player_mask = p_event->get_player();
919+
882920
// Update the action's global state and cache.
883921
if (!is_pressed) {
884922
action_state.api_pressed = false; // Always release the event from action_press() method.
@@ -1014,7 +1052,7 @@ Point2 Input::warp_mouse_motion(const Ref<InputEventMouseMotion> &p_motion, cons
10141052
return rel_warped;
10151053
}
10161054

1017-
void Input::action_press(const StringName &p_action, float p_strength) {
1055+
void Input::action_press(const StringName &p_action, float p_strength, uint8_t p_player_mask) {
10181056
ERR_FAIL_COND_MSG(!InputMap::get_singleton()->has_action(p_action), InputMap::get_singleton()->suggest_actions(p_action));
10191057

10201058
// Create or retrieve existing action.
@@ -1028,10 +1066,11 @@ void Input::action_press(const StringName &p_action, float p_strength) {
10281066
action_state.exact = true;
10291067
action_state.api_pressed = true;
10301068
action_state.api_strength = CLAMP(p_strength, 0.0f, 1.0f);
1069+
action_state.player_mask = p_player_mask;
10311070
_update_action_cache(p_action, action_state);
10321071
}
10331072

1034-
void Input::action_release(const StringName &p_action) {
1073+
void Input::action_release(const StringName &p_action, uint8_t p_player_mask) {
10351074
ERR_FAIL_COND_MSG(!InputMap::get_singleton()->has_action(p_action), InputMap::get_singleton()->suggest_actions(p_action));
10361075

10371076
// Create or retrieve existing action.
@@ -1046,6 +1085,7 @@ void Input::action_release(const StringName &p_action) {
10461085
action_state.exact = true;
10471086
action_state.api_pressed = false;
10481087
action_state.api_strength = 0.0;
1088+
action_state.player_mask = p_player_mask;
10491089
}
10501090

10511091
void Input::set_emulate_touch_from_mouse(bool p_emulate) {
@@ -1067,6 +1107,7 @@ void Input::ensure_touch_mouse_raised() {
10671107
button_event.instantiate();
10681108

10691109
button_event->set_device(InputEvent::DEVICE_ID_EMULATION);
1110+
button_event->set_player_from_device();
10701111
button_event->set_position(mouse_pos);
10711112
button_event->set_global_position(mouse_pos);
10721113
button_event->set_pressed(false);
@@ -1104,6 +1145,7 @@ void Input::set_default_cursor_shape(CursorShape p_shape) {
11041145
mm->set_position(mouse_pos);
11051146
mm->set_global_position(mouse_pos);
11061147
mm->set_device(InputEvent::DEVICE_ID_INTERNAL);
1148+
mm->set_player_from_device();
11071149
parse_input_event(mm);
11081150
}
11091151

@@ -1363,6 +1405,7 @@ void Input::_button_event(int p_device, JoyButton p_index, bool p_pressed) {
13631405
Ref<InputEventJoypadButton> ievent;
13641406
ievent.instantiate();
13651407
ievent->set_device(p_device);
1408+
ievent->set_player_from_device();
13661409
ievent->set_button_index(p_index);
13671410
ievent->set_pressed(p_pressed);
13681411

@@ -1373,6 +1416,7 @@ void Input::_axis_event(int p_device, JoyAxis p_axis, float p_value) {
13731416
Ref<InputEventJoypadMotion> ievent;
13741417
ievent.instantiate();
13751418
ievent->set_device(p_device);
1419+
ievent->set_player_from_device();
13761420
ievent->set_axis(p_axis);
13771421
ievent->set_axis_value(p_value);
13781422

core/input/input.h

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,8 @@ class Input : public Object {
123123
float api_strength = 0.0;
124124
HashMap<int, DeviceState> device_states;
125125

126+
uint8_t player_mask = 1U << 0;
127+
126128
// Cache.
127129
struct ActionStateCache {
128130
bool pressed = false;
@@ -306,14 +308,14 @@ class Input : public Object {
306308
bool is_key_label_pressed(Key p_keycode) const;
307309
bool is_mouse_button_pressed(MouseButton p_button) const;
308310
bool is_joy_button_pressed(int p_device, JoyButton p_button) const;
309-
bool is_action_pressed(const StringName &p_action, bool p_exact = false) const;
310-
bool is_action_just_pressed(const StringName &p_action, bool p_exact = false) const;
311-
bool is_action_just_released(const StringName &p_action, bool p_exact = false) const;
312-
float get_action_strength(const StringName &p_action, bool p_exact = false) const;
313-
float get_action_raw_strength(const StringName &p_action, bool p_exact = false) const;
311+
bool is_action_pressed(const StringName &p_action, bool p_exact = false, BitField<PlayerMask> p_player_mask = PLAYER_ALL) const;
312+
bool is_action_just_pressed(const StringName &p_action, bool p_exact = false, BitField<PlayerMask> p_player_mask = PLAYER_ALL) const;
313+
bool is_action_just_released(const StringName &p_action, bool p_exact = false, BitField<PlayerMask> p_player_mask = PLAYER_ALL) const;
314+
float get_action_strength(const StringName &p_action, bool p_exact = false, BitField<PlayerMask> p_player_mask = PLAYER_ALL) const;
315+
float get_action_raw_strength(const StringName &p_action, bool p_exact = false, BitField<PlayerMask> p_player_mask = PLAYER_ALL) const;
314316

315-
float get_axis(const StringName &p_negative_action, const StringName &p_positive_action) const;
316-
Vector2 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 = -1.0f) const;
317+
float get_axis(const StringName &p_negative_action, const StringName &p_positive_action, BitField<PlayerMask> p_player_mask = PLAYER_ALL) const;
318+
Vector2 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 = -1.0f, BitField<PlayerMask> p_player_mask = PLAYER_ALL) const;
317319

318320
float get_joy_axis(int p_device, JoyAxis p_axis) const;
319321
String get_joy_name(int p_idx);
@@ -350,8 +352,8 @@ class Input : public Object {
350352

351353
void set_mouse_position(const Point2 &p_posf);
352354

353-
void action_press(const StringName &p_action, float p_strength = 1.f);
354-
void action_release(const StringName &p_action);
355+
void action_press(const StringName &p_action, float p_strength = 1.f, uint8_t p_player_mask = 0);
356+
void action_release(const StringName &p_action, uint8_t p_player_mask = 0);
355357

356358
void set_emulate_touch_from_mouse(bool p_emulate);
357359
bool is_emulating_touch_from_mouse() const;

0 commit comments

Comments
 (0)