Keyboard Input modifiers do not block actions.
This means, if you press "F" while holding "shift" and there is and action registered for "F" that action should be pressed. This commit restore this behaviour, lost when implementing is_action_just_pressed. If you want "blocking modifiers" you should code it via script. Fixes 6826
This commit is contained in:
parent
ae258e2679
commit
9100db7b94
3 changed files with 16 additions and 13 deletions
|
@ -107,7 +107,7 @@ List<StringName> InputMap::get_actions() const {
|
||||||
return actions;
|
return actions;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<InputEvent>::Element *InputMap::_find_event(List<InputEvent> &p_list,const InputEvent& p_event, bool p_mod_ignore=false) const {
|
List<InputEvent>::Element *InputMap::_find_event(List<InputEvent> &p_list,const InputEvent& p_event, bool p_action_test) const {
|
||||||
|
|
||||||
for (List<InputEvent>::Element *E=p_list.front();E;E=E->next()) {
|
for (List<InputEvent>::Element *E=p_list.front();E;E=E->next()) {
|
||||||
|
|
||||||
|
@ -123,7 +123,13 @@ List<InputEvent>::Element *InputMap::_find_event(List<InputEvent> &p_list,const
|
||||||
|
|
||||||
case InputEvent::KEY: {
|
case InputEvent::KEY: {
|
||||||
|
|
||||||
same=(e.key.scancode==p_event.key.scancode && (p_mod_ignore || e.key.mod == p_event.key.mod));
|
if(p_action_test) {
|
||||||
|
uint32_t code = e.key.get_scancode_with_modifiers();
|
||||||
|
uint32_t event_code = p_event.key.get_scancode_with_modifiers();
|
||||||
|
same=(e.key.scancode==p_event.key.scancode && (!p_event.key.pressed || ((code & event_code) == code)));
|
||||||
|
} else {
|
||||||
|
same=(e.key.scancode==p_event.key.scancode && e.key.mod == p_event.key.mod);
|
||||||
|
}
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
case InputEvent::JOYPAD_BUTTON: {
|
case InputEvent::JOYPAD_BUTTON: {
|
||||||
|
@ -230,7 +236,7 @@ bool InputMap::event_is_action(const InputEvent& p_event, const StringName& p_ac
|
||||||
return p_event.action.action==E->get().id;
|
return p_event.action.action==E->get().id;
|
||||||
}
|
}
|
||||||
|
|
||||||
return _find_event(E->get().inputs,p_event,!p_event.is_pressed())!=NULL;
|
return _find_event(E->get().inputs,p_event,true)!=NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
const Map<StringName, InputMap::Action>& InputMap::get_action_map() const {
|
const Map<StringName, InputMap::Action>& InputMap::get_action_map() const {
|
||||||
|
|
|
@ -46,7 +46,7 @@ private:
|
||||||
mutable Map<StringName, Action> input_map;
|
mutable Map<StringName, Action> input_map;
|
||||||
mutable Map<int,StringName> input_id_map;
|
mutable Map<int,StringName> input_id_map;
|
||||||
|
|
||||||
List<InputEvent>::Element *_find_event(List<InputEvent> &p_list,const InputEvent& p_event, bool p_mod_ignore) const;
|
List<InputEvent>::Element *_find_event(List<InputEvent> &p_list,const InputEvent& p_event, bool p_action_test=false) const;
|
||||||
|
|
||||||
Array _get_action_list(const StringName& p_action);
|
Array _get_action_list(const StringName& p_action);
|
||||||
Array _get_actions();
|
Array _get_actions();
|
||||||
|
|
|
@ -381,15 +381,12 @@ void InputDefault::parse_input_event(const InputEvent& p_event) {
|
||||||
if (!p_event.is_echo()) {
|
if (!p_event.is_echo()) {
|
||||||
for (const Map<StringName,InputMap::Action>::Element *E=InputMap::get_singleton()->get_action_map().front();E;E=E->next()) {
|
for (const Map<StringName,InputMap::Action>::Element *E=InputMap::get_singleton()->get_action_map().front();E;E=E->next()) {
|
||||||
|
|
||||||
if (InputMap::get_singleton()->event_is_action(p_event,E->key())) {
|
if (InputMap::get_singleton()->event_is_action(p_event,E->key()) && is_action_pressed(E->key()) != p_event.is_pressed()) {
|
||||||
|
Action action;
|
||||||
if(is_action_pressed(E->key()) != p_event.is_pressed()) {
|
action.fixed_frame=Engine::get_singleton()->get_fixed_frames();
|
||||||
Action action;
|
action.idle_frame=Engine::get_singleton()->get_idle_frames();
|
||||||
action.fixed_frame=Engine::get_singleton()->get_fixed_frames();
|
action.pressed=p_event.is_pressed();
|
||||||
action.idle_frame=Engine::get_singleton()->get_idle_frames();
|
action_state[E->key()]=action;
|
||||||
action.pressed=p_event.is_pressed();
|
|
||||||
action_state[E->key()]=action;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue