diff options
Diffstat (limited to 'core/input')
-rw-r--r-- | core/input/input.cpp | 16 | ||||
-rw-r--r-- | core/input/input.h | 2 |
2 files changed, 17 insertions, 1 deletions
diff --git a/core/input/input.cpp b/core/input/input.cpp index 6fd8aca01b..342ab3b704 100644 --- a/core/input/input.cpp +++ b/core/input/input.cpp @@ -91,6 +91,7 @@ Input::MouseMode Input::get_mouse_mode() const { void Input::_bind_methods() { ClassDB::bind_method(D_METHOD("is_key_pressed", "keycode"), &Input::is_key_pressed); + ClassDB::bind_method(D_METHOD("is_physical_key_pressed", "keycode"), &Input::is_physical_key_pressed); ClassDB::bind_method(D_METHOD("is_mouse_button_pressed", "button"), &Input::is_mouse_button_pressed); ClassDB::bind_method(D_METHOD("is_joy_button_pressed", "device", "button"), &Input::is_joy_button_pressed); ClassDB::bind_method(D_METHOD("is_action_pressed", "action", "exact_match"), &Input::is_action_pressed, DEFVAL(false)); @@ -223,6 +224,11 @@ bool Input::is_key_pressed(Key p_keycode) const { return keys_pressed.has(p_keycode); } +bool Input::is_physical_key_pressed(Key p_keycode) const { + _THREAD_SAFE_METHOD_ + return physical_keys_pressed.has(p_keycode); +} + bool Input::is_mouse_button_pressed(MouseButton p_button) const { _THREAD_SAFE_METHOD_ return (mouse_button_mask & mouse_button_to_mask(p_button)) != MouseButton::NONE; @@ -465,6 +471,13 @@ void Input::_parse_input_event_impl(const Ref<InputEvent> &p_event, bool p_is_em keys_pressed.erase(k->get_keycode()); } } + if (k.is_valid() && !k->is_echo() && k->get_physical_keycode() != Key::NONE) { + if (k->is_pressed()) { + physical_keys_pressed.insert(k->get_physical_keycode()); + } else { + physical_keys_pressed.erase(k->get_physical_keycode()); + } + } Ref<InputEventMouseButton> mb = p_event; @@ -862,6 +875,7 @@ void Input::release_pressed_events() { flush_buffered_events(); // this is needed to release actions strengths keys_pressed.clear(); + physical_keys_pressed.clear(); joy_buttons_pressed.clear(); _joy_axis.clear(); @@ -1337,7 +1351,7 @@ void Input::add_joy_mapping(String p_mapping, bool p_update_existing) { void Input::remove_joy_mapping(String p_guid) { for (int i = map_db.size() - 1; i >= 0; i--) { if (p_guid == map_db[i].uid) { - map_db.remove(i); + map_db.remove_at(i); } } for (KeyValue<int, Joypad> &E : joy_names) { diff --git a/core/input/input.h b/core/input/input.h index dd57ebb563..faec654a3c 100644 --- a/core/input/input.h +++ b/core/input/input.h @@ -87,6 +87,7 @@ public: private: MouseButton mouse_button_mask = MouseButton::NONE; + Set<Key> physical_keys_pressed; Set<Key> keys_pressed; Set<JoyButton> joy_buttons_pressed; Map<JoyAxis, float> _joy_axis; @@ -247,6 +248,7 @@ public: static Input *get_singleton(); bool is_key_pressed(Key p_keycode) const; + bool is_physical_key_pressed(Key p_keycode) const; bool is_mouse_button_pressed(MouseButton p_button) const; bool is_joy_button_pressed(int p_device, JoyButton p_button) const; bool is_action_pressed(const StringName &p_action, bool p_exact = false) const; |