diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/globals.cpp | 6 | ||||
-rw-r--r-- | core/input_map.cpp | 58 | ||||
-rw-r--r-- | core/input_map.h | 1 | ||||
-rw-r--r-- | core/os/input_event.cpp | 1 | ||||
-rw-r--r-- | core/variant_parser.cpp | 22 |
5 files changed, 84 insertions, 4 deletions
diff --git a/core/globals.cpp b/core/globals.cpp index 17b139d1ad..1e60854f28 100644 --- a/core/globals.cpp +++ b/core/globals.cpp @@ -638,7 +638,9 @@ static Variant _decode_variant(const String& p_string) { InputEvent ie; ie.type=InputEvent::JOYSTICK_MOTION; ie.device=params[0].to_int(); - ie.joy_motion.axis=params[1].to_int(); + int axis = params[1].to_int();; + ie.joy_motion.axis=axis>>1; + ie.joy_motion.axis_value=axis&1?1:-1; return ie; } @@ -1029,7 +1031,7 @@ static String _encode_variant(const Variant& p_variant) { } break; case InputEvent::JOYSTICK_MOTION: { - return "jaxis("+itos(ev.device)+", "+itos(ev.joy_motion.axis)+")"; + return "jaxis("+itos(ev.device)+", "+itos(ev.joy_motion.axis * 2 + (ev.joy_motion.axis_value<0?0:1))+")"; } break; default: { diff --git a/core/input_map.cpp b/core/input_map.cpp index 6feec9af95..fc66d97a86 100644 --- a/core/input_map.cpp +++ b/core/input_map.cpp @@ -204,6 +204,64 @@ bool InputMap::event_is_action(const InputEvent& p_event, const StringName& p_ac return _find_event(E->get().inputs,p_event)!=NULL; } +bool InputMap::event_is_joy_motion_action_pressed(const InputEvent& p_event) const { + + ERR_FAIL_COND_V(p_event.type!=InputEvent::JOYSTICK_MOTION,false); + bool pressed=false; + + //this could be optimized by having a separate list of joymotions? + + for (Map<StringName, Action>::Element *A=input_map.front();A;A=A->next()) { + + for (List<InputEvent>::Element *E=A->get().inputs.front();E;E=E->next()) { + + const InputEvent& e=E->get(); + if(e.type!=p_event.type) + continue; + if (e.type!=InputEvent::KEY && e.device!=p_event.device) + continue; + + switch(p_event.type) { + + case InputEvent::KEY: { + + if (e.key.scancode==p_event.key.scancode && e.key.mod == p_event.key.mod) + return e.key.pressed; + + } break; + case InputEvent::JOYSTICK_BUTTON: { + + if (e.joy_button.button_index==p_event.joy_button.button_index) { + return e.joy_button.pressed; + } + + } break; + case InputEvent::MOUSE_BUTTON: { + + if (e.mouse_button.button_index==p_event.mouse_button.button_index) { + return e.mouse_button.pressed; + } + + } break; + case InputEvent::JOYSTICK_MOTION: { + + if (e.joy_motion.axis==p_event.joy_motion.axis) { + if ( + (e.joy_motion.axis_value * p_event.joy_motion.axis_value >0) && //same axis + ABS(e.joy_motion.axis_value>0.5) && ABS(p_event.joy_motion.axis_value>0.5) ) + pressed=true; + } + + } break; + } + + } + } + + return pressed; + +} + void InputMap::load_from_globals() { input_map.clear();; diff --git a/core/input_map.h b/core/input_map.h index c803d5bf04..5cd1e41922 100644 --- a/core/input_map.h +++ b/core/input_map.h @@ -68,6 +68,7 @@ public: const List<InputEvent> *get_action_list(const StringName& p_action); bool event_is_action(const InputEvent& p_event, const StringName& p_action) const; + bool event_is_joy_motion_action_pressed(const InputEvent& p_event) const; void load_from_globals(); diff --git a/core/os/input_event.cpp b/core/os/input_event.cpp index 25b10a76d3..2f39567a7e 100644 --- a/core/os/input_event.cpp +++ b/core/os/input_event.cpp @@ -156,6 +156,7 @@ bool InputEvent::is_pressed() const { case MOUSE_BUTTON: return mouse_button.pressed; case JOYSTICK_BUTTON: return joy_button.pressed; case SCREEN_TOUCH: return screen_touch.pressed; + case JOYSTICK_MOTION: return InputMap::get_singleton()->event_is_joy_motion_action_pressed(*this); case ACTION: return action.pressed; default: {} } diff --git a/core/variant_parser.cpp b/core/variant_parser.cpp index 3c8c43f5b3..9f2727d33d 100644 --- a/core/variant_parser.cpp +++ b/core/variant_parser.cpp @@ -1072,8 +1072,24 @@ Error VariantParser::parse_value(Token& token,Variant &value,Stream *p_stream,in ie.joy_motion.axis = token.value; get_token(p_stream,token,line,r_err_str); + + if (token.type!=TK_COMMA) { + r_err_str="Expected ',' after axis index"; + return ERR_PARSE_ERROR; + } + + get_token(p_stream,token,line,r_err_str); + if (token.type!=TK_NUMBER) { + r_err_str="Expected axis sign"; + return ERR_PARSE_ERROR; + } + + ie.joy_motion.axis_value = token.value; + + get_token(p_stream,token,line,r_err_str); + if (token.type!=TK_PARENTHESIS_CLOSE) { - r_err_str="Expected ')'"; + r_err_str="Expected ')' for jaxis"; return ERR_PARSE_ERROR; } @@ -1339,7 +1355,9 @@ Error VariantParser::parse_value(Token& token,Variant &value,Stream *p_stream,in InputEvent ie; ie.type=InputEvent::JOYSTICK_MOTION; ie.device=params[0].to_int(); - ie.joy_motion.axis=params[1].to_int(); + int axis=params[1].to_int(); + ie.joy_motion.axis=axis>>1; + ie.joy_motion.axis_value=axis&1?1:-1; value= ie; |