Add configurable strength value to InputEventAction

This commit is contained in:
Gilles Roudiere 2019-06-01 15:31:47 +02:00
parent 449395716f
commit f247832832
4 changed files with 21 additions and 1 deletions

View file

@ -202,7 +202,7 @@ bool InputMap::event_get_action_status(const Ref<InputEvent> &p_event, const Str
if (p_pressed != NULL) if (p_pressed != NULL)
*p_pressed = input_event_action->is_pressed(); *p_pressed = input_event_action->is_pressed();
if (p_strength != NULL) if (p_strength != NULL)
*p_strength = (*p_pressed) ? 1.0f : 0.0f; *p_strength = (*p_pressed) ? input_event_action->get_strength() : 0.0f;
return input_event_action->get_action() == p_action; return input_event_action->get_action() == p_action;
} }

View file

@ -1010,6 +1010,14 @@ bool InputEventAction::is_pressed() const {
return pressed; return pressed;
} }
void InputEventAction::set_strength(float p_strength) {
strength = CLAMP(p_strength, 0.0f, 1.0f);
}
float InputEventAction::get_strength() const {
return strength;
}
bool InputEventAction::shortcut_match(const Ref<InputEvent> &p_event) const { bool InputEventAction::shortcut_match(const Ref<InputEvent> &p_event) const {
if (p_event.is_null()) if (p_event.is_null())
return false; return false;
@ -1051,14 +1059,19 @@ void InputEventAction::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_pressed", "pressed"), &InputEventAction::set_pressed); ClassDB::bind_method(D_METHOD("set_pressed", "pressed"), &InputEventAction::set_pressed);
//ClassDB::bind_method(D_METHOD("is_pressed"), &InputEventAction::is_pressed); //ClassDB::bind_method(D_METHOD("is_pressed"), &InputEventAction::is_pressed);
ClassDB::bind_method(D_METHOD("set_strength", "strength"), &InputEventAction::set_strength);
ClassDB::bind_method(D_METHOD("get_strength"), &InputEventAction::get_strength);
// ClassDB::bind_method(D_METHOD("is_action", "name"), &InputEventAction::is_action); // ClassDB::bind_method(D_METHOD("is_action", "name"), &InputEventAction::is_action);
ADD_PROPERTY(PropertyInfo(Variant::STRING, "action"), "set_action", "get_action"); ADD_PROPERTY(PropertyInfo(Variant::STRING, "action"), "set_action", "get_action");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "pressed"), "set_pressed", "is_pressed"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "pressed"), "set_pressed", "is_pressed");
ADD_PROPERTY(PropertyInfo(Variant::REAL, "strength", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_strength", "get_strength");
} }
InputEventAction::InputEventAction() { InputEventAction::InputEventAction() {
pressed = false; pressed = false;
strength = 1.0f;
} }
///////////////////////////// /////////////////////////////

View file

@ -475,6 +475,7 @@ class InputEventAction : public InputEvent {
StringName action; StringName action;
bool pressed; bool pressed;
float strength;
protected: protected:
static void _bind_methods(); static void _bind_methods();
@ -486,6 +487,9 @@ public:
void set_pressed(bool p_pressed); void set_pressed(bool p_pressed);
virtual bool is_pressed() const; virtual bool is_pressed() const;
void set_strength(float p_strength);
float get_strength() const;
virtual bool is_action(const StringName &p_action) const; virtual bool is_action(const StringName &p_action) const;
virtual bool action_match(const Ref<InputEvent> &p_event, bool *p_pressed, float *p_strength, float p_deadzone) const; virtual bool action_match(const Ref<InputEvent> &p_event, bool *p_pressed, float *p_strength, float p_deadzone) const;

View file

@ -18,6 +18,9 @@
<member name="pressed" type="bool" setter="set_pressed" getter="is_pressed"> <member name="pressed" type="bool" setter="set_pressed" getter="is_pressed">
If [code]true[/code], the action's state is pressed. If [code]false[/code], the action's state is released. If [code]true[/code], the action's state is pressed. If [code]false[/code], the action's state is released.
</member> </member>
<member name="strength" type="float" setter="set_strength" getter="get_strength">
The action's strength between 0 and 1. This value is consired as equal to 0 if pressed is [code]false[/code]. The event strength allows faking analog joypad motion events, by precising how strongly is the joypad axis bent or pressed.
</member>
</members> </members>
<constants> <constants>
</constants> </constants>