|
@@ -97,11 +97,11 @@ void Input::_bind_methods() {
|
|
|
ClassDB::bind_method(D_METHOD("is_key_pressed", "keycode"), &Input::is_key_pressed);
|
|
|
ClassDB::bind_method(D_METHOD("is_mouse_button_pressed", "button"), &Input::is_mouse_button_pressed);
|
|
|
ClassDB::bind_method(D_METHOD("is_joy_button_pressed", "device", "button"), &Input::is_joy_button_pressed);
|
|
|
- ClassDB::bind_method(D_METHOD("is_action_pressed", "action"), &Input::is_action_pressed);
|
|
|
- ClassDB::bind_method(D_METHOD("is_action_just_pressed", "action"), &Input::is_action_just_pressed);
|
|
|
- ClassDB::bind_method(D_METHOD("is_action_just_released", "action"), &Input::is_action_just_released);
|
|
|
- ClassDB::bind_method(D_METHOD("get_action_strength", "action"), &Input::get_action_strength);
|
|
|
- ClassDB::bind_method(D_METHOD("get_action_raw_strength", "action"), &Input::get_action_strength);
|
|
|
+ ClassDB::bind_method(D_METHOD("is_action_pressed", "action", "exact"), &Input::is_action_pressed, DEFVAL(false));
|
|
|
+ ClassDB::bind_method(D_METHOD("is_action_just_pressed", "action", "exact"), &Input::is_action_just_pressed, DEFVAL(false));
|
|
|
+ ClassDB::bind_method(D_METHOD("is_action_just_released", "action", "exact"), &Input::is_action_just_released, DEFVAL(false));
|
|
|
+ ClassDB::bind_method(D_METHOD("get_action_strength", "action", "exact"), &Input::get_action_strength, DEFVAL(false));
|
|
|
+ ClassDB::bind_method(D_METHOD("get_action_raw_strength", "action", "exact"), &Input::get_action_strength, DEFVAL(false));
|
|
|
ClassDB::bind_method(D_METHOD("get_axis", "negative_action", "positive_action"), &Input::get_axis);
|
|
|
ClassDB::bind_method(D_METHOD("get_vector", "negative_x", "positive_x", "negative_y", "positive_y", "deadzone"), &Input::get_vector, DEFVAL(-1.0f));
|
|
|
ClassDB::bind_method(D_METHOD("add_joy_mapping", "mapping", "update_existing"), &Input::add_joy_mapping, DEFVAL(false));
|
|
@@ -240,16 +240,20 @@ bool Input::is_joy_button_pressed(int p_device, int p_button) const {
|
|
|
return joy_buttons_pressed.has(_combine_device(p_button, p_device));
|
|
|
}
|
|
|
|
|
|
-bool Input::is_action_pressed(const StringName &p_action) const {
|
|
|
- return action_state.has(p_action) && action_state[p_action].pressed;
|
|
|
+bool Input::is_action_pressed(const StringName &p_action, bool p_exact) const {
|
|
|
+ return action_state.has(p_action) && action_state[p_action].pressed && (p_exact ? action_state[p_action].exact : true);
|
|
|
}
|
|
|
|
|
|
-bool Input::is_action_just_pressed(const StringName &p_action) const {
|
|
|
+bool Input::is_action_just_pressed(const StringName &p_action, bool p_exact) const {
|
|
|
const Map<StringName, Action>::Element *E = action_state.find(p_action);
|
|
|
if (!E) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+ if (p_exact && E->get().exact == false) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
if (Engine::get_singleton()->is_in_physics_frame()) {
|
|
|
return E->get().pressed && E->get().physics_frame == Engine::get_singleton()->get_physics_frames();
|
|
|
} else {
|
|
@@ -257,12 +261,16 @@ bool Input::is_action_just_pressed(const StringName &p_action) const {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-bool Input::is_action_just_released(const StringName &p_action) const {
|
|
|
+bool Input::is_action_just_released(const StringName &p_action, bool p_exact) const {
|
|
|
const Map<StringName, Action>::Element *E = action_state.find(p_action);
|
|
|
if (!E) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+ if (p_exact && E->get().exact == false) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
if (Engine::get_singleton()->is_in_physics_frame()) {
|
|
|
return !E->get().pressed && E->get().physics_frame == Engine::get_singleton()->get_physics_frames();
|
|
|
} else {
|
|
@@ -270,21 +278,29 @@ bool Input::is_action_just_released(const StringName &p_action) const {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-float Input::get_action_strength(const StringName &p_action) const {
|
|
|
+float Input::get_action_strength(const StringName &p_action, bool p_exact) const {
|
|
|
const Map<StringName, Action>::Element *E = action_state.find(p_action);
|
|
|
if (!E) {
|
|
|
return 0.0f;
|
|
|
}
|
|
|
|
|
|
+ if (p_exact && E->get().exact == false) {
|
|
|
+ return 0.0f;
|
|
|
+ }
|
|
|
+
|
|
|
return E->get().strength;
|
|
|
}
|
|
|
|
|
|
-float Input::get_action_raw_strength(const StringName &p_action) const {
|
|
|
+float Input::get_action_raw_strength(const StringName &p_action, bool p_exact) const {
|
|
|
const Map<StringName, Action>::Element *E = action_state.find(p_action);
|
|
|
if (!E) {
|
|
|
return 0.0f;
|
|
|
}
|
|
|
|
|
|
+ if (p_exact && E->get().exact == false) {
|
|
|
+ return 0.0f;
|
|
|
+ }
|
|
|
+
|
|
|
return E->get().raw_strength;
|
|
|
}
|
|
|
|
|
@@ -590,14 +606,15 @@ void Input::_parse_input_event_impl(const Ref<InputEvent> &p_event, bool p_is_em
|
|
|
|
|
|
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())) {
|
|
|
- // Save the action's state
|
|
|
- if (!p_event->is_echo() && is_action_pressed(E->key()) != p_event->is_action_pressed(E->key())) {
|
|
|
+ // If not echo and action pressed state has changed
|
|
|
+ if (!p_event->is_echo() && is_action_pressed(E->key(), false) != p_event->is_action_pressed(E->key())) {
|
|
|
Action action;
|
|
|
action.physics_frame = Engine::get_singleton()->get_physics_frames();
|
|
|
action.process_frame = Engine::get_singleton()->get_process_frames();
|
|
|
action.pressed = p_event->is_action_pressed(E->key());
|
|
|
action.strength = 0.0f;
|
|
|
action.raw_strength = 0.0f;
|
|
|
+ action.exact = InputMap::get_singleton()->event_is_action(p_event, E->key(), true);
|
|
|
action_state[E->key()] = action;
|
|
|
}
|
|
|
action_state[E->key()].strength = p_event->get_action_strength(E->key());
|