Ensure minimum modifiers are pressed when matching actions
This commit is contained in:
parent
88e2c513e7
commit
88c723c33c
4 changed files with 23 additions and 13 deletions
|
@ -300,8 +300,13 @@ bool InputEventKey::action_match(const Ref<InputEvent> &p_event, bool p_exact_ma
|
||||||
} else {
|
} else {
|
||||||
match = physical_scancode == key->physical_scancode;
|
match = physical_scancode == key->physical_scancode;
|
||||||
}
|
}
|
||||||
|
uint32_t action_mask = get_modifiers_mask();
|
||||||
|
uint32_t key_mask = key->get_modifiers_mask();
|
||||||
|
if (key->is_pressed()) {
|
||||||
|
match &= (action_mask & key_mask) == action_mask;
|
||||||
|
}
|
||||||
if (p_exact_match) {
|
if (p_exact_match) {
|
||||||
match &= get_modifiers_mask() == key->get_modifiers_mask();
|
match &= action_mask == key_mask;
|
||||||
}
|
}
|
||||||
if (match) {
|
if (match) {
|
||||||
bool pressed = key->is_pressed();
|
bool pressed = key->is_pressed();
|
||||||
|
@ -469,8 +474,13 @@ bool InputEventMouseButton::action_match(const Ref<InputEvent> &p_event, bool p_
|
||||||
}
|
}
|
||||||
|
|
||||||
bool match = mb->button_index == button_index;
|
bool match = mb->button_index == button_index;
|
||||||
|
uint32_t action_mask = get_modifiers_mask();
|
||||||
|
uint32_t button_mask = mb->get_modifiers_mask();
|
||||||
|
if (mb->is_pressed()) {
|
||||||
|
match &= (action_mask & button_mask) == action_mask;
|
||||||
|
}
|
||||||
if (p_exact_match) {
|
if (p_exact_match) {
|
||||||
match &= get_modifiers_mask() == mb->get_modifiers_mask();
|
match &= action_mask == button_mask;
|
||||||
}
|
}
|
||||||
if (match) {
|
if (match) {
|
||||||
bool pressed = mb->is_pressed();
|
bool pressed = mb->is_pressed();
|
||||||
|
|
|
@ -58,7 +58,7 @@
|
||||||
<argument index="1" name="exact" type="bool" default="false" />
|
<argument index="1" name="exact" type="bool" default="false" />
|
||||||
<description>
|
<description>
|
||||||
Returns a value between 0 and 1 representing the raw intensity of the given action, ignoring the action's deadzone. In most cases, you should use [method get_action_strength] instead.
|
Returns a value between 0 and 1 representing the raw intensity of the given action, ignoring the action's deadzone. In most cases, you should use [method get_action_strength] instead.
|
||||||
If [code]exact[/code] is [code]false[/code], it ignores the input modifiers for [InputEventKey] and [InputEventMouseButton] events, and the direction for [InputEventJoypadMotion] events.
|
If [code]exact[/code] is [code]false[/code], it ignores additional input modifiers for [InputEventKey] and [InputEventMouseButton] events, and the direction for [InputEventJoypadMotion] events.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="get_action_strength" qualifiers="const">
|
<method name="get_action_strength" qualifiers="const">
|
||||||
|
@ -67,7 +67,7 @@
|
||||||
<argument index="1" name="exact" type="bool" default="false" />
|
<argument index="1" name="exact" type="bool" default="false" />
|
||||||
<description>
|
<description>
|
||||||
Returns a value between 0 and 1 representing the intensity of the given action. In a joypad, for example, the further away the axis (analog sticks or L2, R2 triggers) is from the dead zone, the closer the value will be to 1. If the action is mapped to a control that has no axis as the keyboard, the value returned will be 0 or 1.
|
Returns a value between 0 and 1 representing the intensity of the given action. In a joypad, for example, the further away the axis (analog sticks or L2, R2 triggers) is from the dead zone, the closer the value will be to 1. If the action is mapped to a control that has no axis as the keyboard, the value returned will be 0 or 1.
|
||||||
If [code]exact[/code] is [code]false[/code], it ignores the input modifiers for [InputEventKey] and [InputEventMouseButton] events, and the direction for [InputEventJoypadMotion] events.
|
If [code]exact[/code] is [code]false[/code], it ignores additional input modifiers for [InputEventKey] and [InputEventMouseButton] events, and the direction for [InputEventJoypadMotion] events.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="get_axis" qualifiers="const">
|
<method name="get_axis" qualifiers="const">
|
||||||
|
@ -214,7 +214,7 @@
|
||||||
<description>
|
<description>
|
||||||
Returns [code]true[/code] when the user starts pressing the action event, meaning it's [code]true[/code] only on the frame that the user pressed down the button.
|
Returns [code]true[/code] when the user starts pressing the action event, meaning it's [code]true[/code] only on the frame that the user pressed down the button.
|
||||||
This is useful for code that needs to run only once when an action is pressed, instead of every frame while it's pressed.
|
This is useful for code that needs to run only once when an action is pressed, instead of every frame while it's pressed.
|
||||||
If [code]exact[/code] is [code]false[/code], it ignores the input modifiers for [InputEventKey] and [InputEventMouseButton] events, and the direction for [InputEventJoypadMotion] events.
|
If [code]exact[/code] is [code]false[/code], it ignores additional input modifiers for [InputEventKey] and [InputEventMouseButton] events, and the direction for [InputEventJoypadMotion] events.
|
||||||
[b]Note:[/b] Due to keyboard ghosting, [method is_action_just_pressed] may return [code]false[/code] even if one of the action's keys is pressed. See [url=$DOCS_URL/tutorials/inputs/input_examples.html#keyboard-events]Input examples[/url] in the documentation for more information.
|
[b]Note:[/b] Due to keyboard ghosting, [method is_action_just_pressed] may return [code]false[/code] even if one of the action's keys is pressed. See [url=$DOCS_URL/tutorials/inputs/input_examples.html#keyboard-events]Input examples[/url] in the documentation for more information.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
|
@ -224,7 +224,7 @@
|
||||||
<argument index="1" name="exact" type="bool" default="false" />
|
<argument index="1" name="exact" type="bool" default="false" />
|
||||||
<description>
|
<description>
|
||||||
Returns [code]true[/code] when the user stops pressing the action event, meaning it's [code]true[/code] only on the frame that the user released the button.
|
Returns [code]true[/code] when the user stops pressing the action event, meaning it's [code]true[/code] only on the frame that the user released the button.
|
||||||
If [code]exact[/code] is [code]false[/code], it ignores the input modifiers for [InputEventKey] and [InputEventMouseButton] events, and the direction for [InputEventJoypadMotion] events.
|
If [code]exact[/code] is [code]false[/code], it ignores additional input modifiers for [InputEventKey] and [InputEventMouseButton] events, and the direction for [InputEventJoypadMotion] events.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="is_action_pressed" qualifiers="const">
|
<method name="is_action_pressed" qualifiers="const">
|
||||||
|
@ -233,7 +233,7 @@
|
||||||
<argument index="1" name="exact" type="bool" default="false" />
|
<argument index="1" name="exact" type="bool" default="false" />
|
||||||
<description>
|
<description>
|
||||||
Returns [code]true[/code] if you are pressing the action event. Note that if an action has multiple buttons assigned and more than one of them is pressed, releasing one button will release the action, even if some other button assigned to this action is still pressed.
|
Returns [code]true[/code] if you are pressing the action event. Note that if an action has multiple buttons assigned and more than one of them is pressed, releasing one button will release the action, even if some other button assigned to this action is still pressed.
|
||||||
If [code]exact[/code] is [code]false[/code], it ignores the input modifiers for [InputEventKey] and [InputEventMouseButton] events, and the direction for [InputEventJoypadMotion] events.
|
If [code]exact[/code] is [code]false[/code], it ignores additional input modifiers for [InputEventKey] and [InputEventMouseButton] events, and the direction for [InputEventJoypadMotion] events.
|
||||||
[b]Note:[/b] Due to keyboard ghosting, [method is_action_pressed] may return [code]false[/code] even if one of the action's keys is pressed. See [url=$DOCS_URL/tutorials/inputs/input_examples.html#keyboard-events]Input examples[/url] in the documentation for more information.
|
[b]Note:[/b] Due to keyboard ghosting, [method is_action_pressed] may return [code]false[/code] even if one of the action's keys is pressed. See [url=$DOCS_URL/tutorials/inputs/input_examples.html#keyboard-events]Input examples[/url] in the documentation for more information.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
<argument index="1" name="exact_match" type="bool" default="false" />
|
<argument index="1" name="exact_match" type="bool" default="false" />
|
||||||
<description>
|
<description>
|
||||||
Returns a value between 0.0 and 1.0 depending on the given actions' state. Useful for getting the value of events of type [InputEventJoypadMotion].
|
Returns a value between 0.0 and 1.0 depending on the given actions' state. Useful for getting the value of events of type [InputEventJoypadMotion].
|
||||||
If [code]exact_match[/code] is [code]false[/code], it ignores the input modifiers for [InputEventKey] and [InputEventMouseButton] events, and the direction for [InputEventJoypadMotion] events.
|
If [code]exact_match[/code] is [code]false[/code], it ignores additional input modifiers for [InputEventKey] and [InputEventMouseButton] events, and the direction for [InputEventJoypadMotion] events.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="is_action" qualifiers="const">
|
<method name="is_action" qualifiers="const">
|
||||||
|
@ -42,7 +42,7 @@
|
||||||
<argument index="1" name="exact_match" type="bool" default="false" />
|
<argument index="1" name="exact_match" type="bool" default="false" />
|
||||||
<description>
|
<description>
|
||||||
Returns [code]true[/code] if this input event matches a pre-defined action of any type.
|
Returns [code]true[/code] if this input event matches a pre-defined action of any type.
|
||||||
If [code]exact_match[/code] is [code]false[/code], it ignores the input modifiers for [InputEventKey] and [InputEventMouseButton] events, and the direction for [InputEventJoypadMotion] events.
|
If [code]exact_match[/code] is [code]false[/code], it ignores additional input modifiers for [InputEventKey] and [InputEventMouseButton] events, and the direction for [InputEventJoypadMotion] events.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="is_action_pressed" qualifiers="const">
|
<method name="is_action_pressed" qualifiers="const">
|
||||||
|
@ -52,7 +52,7 @@
|
||||||
<argument index="2" name="exact_match" type="bool" default="false" />
|
<argument index="2" name="exact_match" type="bool" default="false" />
|
||||||
<description>
|
<description>
|
||||||
Returns [code]true[/code] if the given action is being pressed (and is not an echo event for [InputEventKey] events, unless [code]allow_echo[/code] is [code]true[/code]). Not relevant for events of type [InputEventMouseMotion] or [InputEventScreenDrag].
|
Returns [code]true[/code] if the given action is being pressed (and is not an echo event for [InputEventKey] events, unless [code]allow_echo[/code] is [code]true[/code]). Not relevant for events of type [InputEventMouseMotion] or [InputEventScreenDrag].
|
||||||
If [code]exact_match[/code] is [code]false[/code], it ignores the input modifiers for [InputEventKey] and [InputEventMouseButton] events, and the direction for [InputEventJoypadMotion] events.
|
If [code]exact_match[/code] is [code]false[/code], it ignores additional input modifiers for [InputEventKey] and [InputEventMouseButton] events, and the direction for [InputEventJoypadMotion] events.
|
||||||
[b]Note:[/b] Due to keyboard ghosting, [method is_action_pressed] may return [code]false[/code] even if one of the action's keys is pressed. See [url=$DOCS_URL/tutorials/inputs/input_examples.html#keyboard-events]Input examples[/url] in the documentation for more information.
|
[b]Note:[/b] Due to keyboard ghosting, [method is_action_pressed] may return [code]false[/code] even if one of the action's keys is pressed. See [url=$DOCS_URL/tutorials/inputs/input_examples.html#keyboard-events]Input examples[/url] in the documentation for more information.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
|
@ -62,7 +62,7 @@
|
||||||
<argument index="1" name="exact_match" type="bool" default="false" />
|
<argument index="1" name="exact_match" type="bool" default="false" />
|
||||||
<description>
|
<description>
|
||||||
Returns [code]true[/code] if the given action is released (i.e. not pressed). Not relevant for events of type [InputEventMouseMotion] or [InputEventScreenDrag].
|
Returns [code]true[/code] if the given action is released (i.e. not pressed). Not relevant for events of type [InputEventMouseMotion] or [InputEventScreenDrag].
|
||||||
If [code]exact_match[/code] is [code]false[/code], it ignores the input modifiers for [InputEventKey] and [InputEventMouseButton] events, and the direction for [InputEventJoypadMotion] events.
|
If [code]exact_match[/code] is [code]false[/code], it ignores additional input modifiers for [InputEventKey] and [InputEventMouseButton] events, and the direction for [InputEventJoypadMotion] events.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="is_action_type" qualifiers="const">
|
<method name="is_action_type" qualifiers="const">
|
||||||
|
@ -90,7 +90,7 @@
|
||||||
<argument index="1" name="exact_match" type="bool" default="true" />
|
<argument index="1" name="exact_match" type="bool" default="true" />
|
||||||
<description>
|
<description>
|
||||||
Returns [code]true[/code] if the specified [code]event[/code] matches this event. Only valid for action events i.e key ([InputEventKey]), button ([InputEventMouseButton] or [InputEventJoypadButton]), axis [InputEventJoypadMotion] or action ([InputEventAction]) events.
|
Returns [code]true[/code] if the specified [code]event[/code] matches this event. Only valid for action events i.e key ([InputEventKey]), button ([InputEventMouseButton] or [InputEventJoypadButton]), axis [InputEventJoypadMotion] or action ([InputEventAction]) events.
|
||||||
If [code]exact_match[/code] is [code]false[/code], it ignores the input modifiers for [InputEventKey] and [InputEventMouseButton] events, and the direction for [InputEventJoypadMotion] events.
|
If [code]exact_match[/code] is [code]false[/code], it ignores additional input modifiers for [InputEventKey] and [InputEventMouseButton] events, and the direction for [InputEventJoypadMotion] events.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="xformed_by" qualifiers="const">
|
<method name="xformed_by" qualifiers="const">
|
||||||
|
|
|
@ -79,7 +79,7 @@
|
||||||
<argument index="2" name="exact_match" type="bool" default="false" />
|
<argument index="2" name="exact_match" type="bool" default="false" />
|
||||||
<description>
|
<description>
|
||||||
Returns [code]true[/code] if the given event is part of an existing action. This method ignores keyboard modifiers if the given [InputEvent] is not pressed (for proper release detection). See [method action_has_event] if you don't want this behavior.
|
Returns [code]true[/code] if the given event is part of an existing action. This method ignores keyboard modifiers if the given [InputEvent] is not pressed (for proper release detection). See [method action_has_event] if you don't want this behavior.
|
||||||
If [code]exact_match[/code] is [code]false[/code], it ignores the input modifiers for [InputEventKey] and [InputEventMouseButton] events, and the direction for [InputEventJoypadMotion] events.
|
If [code]exact_match[/code] is [code]false[/code], it ignores additional input modifiers for [InputEventKey] and [InputEventMouseButton] events, and the direction for [InputEventJoypadMotion] events.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="get_action_list">
|
<method name="get_action_list">
|
||||||
|
|
Loading…
Reference in a new issue