-Modified Input and added is_action_just_pressed() as well as is_action_just_released()

This commit is contained in:
Juan Linietsky
2016-09-01 18:58:52 -03:00
parent 3759d378da
commit 5b96c3a552
11 changed files with 196 additions and 41 deletions

View File

@@ -71,13 +71,13 @@ InputDefault::SpeedTrack::SpeedTrack() {
reset();
}
bool InputDefault::is_key_pressed(int p_scancode) {
bool InputDefault::is_key_pressed(int p_scancode) const {
_THREAD_SAFE_METHOD_
return keys_pressed.has(p_scancode);
}
bool InputDefault::is_mouse_button_pressed(int p_button) {
bool InputDefault::is_mouse_button_pressed(int p_button) const {
_THREAD_SAFE_METHOD_
return (mouse_button_mask&(1<<p_button))!=0;
@@ -89,14 +89,16 @@ static int _combine_device(int p_value,int p_device) {
return p_value|(p_device<<20);
}
bool InputDefault::is_joy_button_pressed(int p_device, int p_button) {
bool InputDefault::is_joy_button_pressed(int p_device, int p_button) const{
_THREAD_SAFE_METHOD_
return joy_buttons_pressed.has(_combine_device(p_button,p_device));
}
bool InputDefault::is_action_pressed(const StringName& p_action) {
bool InputDefault::is_action_pressed(const StringName& p_action) const{
return action_state.has(p_action) && action_state[p_action].pressed;
#if 0
if (custom_action_press.has(p_action))
return true; //simpler
@@ -147,9 +149,37 @@ bool InputDefault::is_action_pressed(const StringName& p_action) {
}
return false;
#endif
}
float InputDefault::get_joy_axis(int p_device,int p_axis) {
bool InputDefault::is_action_just_pressed(const StringName& p_action) const {
const Map<StringName,Action>::Element *E=action_state.find(p_action);
if (!E)
return false;
if (OS::get_singleton()->is_in_fixed_frame()) {
return E->get().pressed && E->get().fixed_frame==OS::get_singleton()->get_fixed_frames();
} else {
return E->get().pressed && E->get().idle_frame==OS::get_singleton()->get_idle_frames();
}
}
bool InputDefault::is_action_just_released(const StringName& p_action) const{
const Map<StringName,Action>::Element *E=action_state.find(p_action);
if (!E)
return false;
if (OS::get_singleton()->is_in_fixed_frame()) {
return !E->get().pressed && E->get().fixed_frame==OS::get_singleton()->get_fixed_frames();
} else {
return !E->get().pressed && E->get().idle_frame==OS::get_singleton()->get_idle_frames();
}
}
float InputDefault::get_joy_axis(int p_device,int p_axis) const{
_THREAD_SAFE_METHOD_
int c = _combine_device(p_axis,p_device);
@@ -247,19 +277,19 @@ void InputDefault::joy_connection_changed(int p_idx, bool p_connected, String p_
emit_signal("joy_connection_changed", p_idx, p_connected);
};
Vector3 InputDefault::get_accelerometer() {
Vector3 InputDefault::get_accelerometer() const{
_THREAD_SAFE_METHOD_
return accelerometer;
}
Vector3 InputDefault::get_magnetometer() {
Vector3 InputDefault::get_magnetometer() const{
_THREAD_SAFE_METHOD_
return magnetometer;
}
Vector3 InputDefault::get_gyroscope() {
Vector3 InputDefault::get_gyroscope() const {
_THREAD_SAFE_METHOD_
return gyroscope;
@@ -341,6 +371,23 @@ void InputDefault::parse_input_event(const InputEvent& p_event) {
}
if (!p_event.is_echo()) {
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())) {
Action action;
action.fixed_frame=OS::get_singleton()->get_fixed_frames();
action.idle_frame=OS::get_singleton()->get_idle_frames();
action.pressed=p_event.is_pressed();
action_state[E->key()]=action;
}
}
}
if (main_loop)
main_loop->input_event(p_event);
@@ -441,21 +488,25 @@ void InputDefault::iteration(float p_step) {
void InputDefault::action_press(const StringName& p_action) {
if (custom_action_press.has(p_action)) {
Action action;
action.fixed_frame=OS::get_singleton()->get_fixed_frames();
action.idle_frame=OS::get_singleton()->get_idle_frames();
action.pressed=true;
action_state[p_action]=action;
custom_action_press[p_action]++;
} else {
custom_action_press[p_action]=1;
}
}
void InputDefault::action_release(const StringName& p_action){
ERR_FAIL_COND(!custom_action_press.has(p_action));
custom_action_press[p_action]--;
if (custom_action_press[p_action]==0) {
custom_action_press.erase(p_action);
}
Action action;
action.fixed_frame=OS::get_singleton()->get_fixed_frames();
action.idle_frame=OS::get_singleton()->get_idle_frames();
action.pressed=true;
action_state[p_action]=action;
}
void InputDefault::set_emulate_touch(bool p_emulate) {