Merge pull request #7649 from Faless/fix_input_master

Keyboard Input modifiers do not block actions.
This commit is contained in:
Rémi Verschelde 2017-02-02 08:07:48 +01:00 committed by GitHub
commit af6d59eed6
3 changed files with 16 additions and 13 deletions

View file

@ -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 {

View file

@ -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();

View file

@ -381,9 +381,7 @@ 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()) {
if(is_action_pressed(E->key()) != p_event.is_pressed()) {
Action action; Action action;
action.fixed_frame=Engine::get_singleton()->get_fixed_frames(); action.fixed_frame=Engine::get_singleton()->get_fixed_frames();
action.idle_frame=Engine::get_singleton()->get_idle_frames(); action.idle_frame=Engine::get_singleton()->get_idle_frames();
@ -392,7 +390,6 @@ void InputDefault::parse_input_event(const InputEvent& p_event) {
} }
} }
} }
}
if (main_loop) if (main_loop)
main_loop->input_event(p_event); main_loop->input_event(p_event);