Explorar o código

More input cleanup

Dan Elkouby %!s(int64=10) %!d(string=hai) anos
pai
achega
31c47c058c
Modificáronse 1 ficheiros con 24 adicións e 28 borrados
  1. 24 28
      src/input/Input.cpp

+ 24 - 28
src/input/Input.cpp

@@ -12,7 +12,12 @@ struct InputMap
     keycode_t key_code;
 };
 
-KeyState key_states[Key::K_SIZE] = {KeyState::KS_RELEASED};
+struct KeyBuffer
+{
+    bool current;
+    bool previous;
+};
+struct KeyBuffer key_states[Key::K_SIZE] = {{false, false}};
 
 // TODO: make these software-mappable
 #ifdef SFML
@@ -46,51 +51,42 @@ static InputMap key_map[] = {
 
 KeyState INPUT::key_get_state(Key key)
 {
-        return key_states[key];
+    // "Just" pressed/released before held/inactive to let these events through
+    if (key_pressed(key))
+        return KS_JUST_PRESSED;
+    if (key_down(key))
+        return KS_PRESSED;
+    if (key_released(key))
+        return KS_JUST_RELEASED;
+    if (key_up(key))
+        return KS_RELEASED;
+
+    // Default case to mute compiler warnings, shouldn't even reach here in practice
+    return KS_RELEASED;
 }
 
 void INPUT::key_poll()
 {
     for (unsigned i = 0; i < K_SIZE; i++)
     {
-        bool current_key_state = WalrusRPG::Quirks::get_key(key_map[i].key_code);
-        KeyState previous_key_state = key_states[i];
-
-        KeyState resulting_key_state = KS_RELEASED;
-        if (current_key_state)
-        {
-            if (previous_key_state == KS_RELEASED ||
-                previous_key_state == KS_JUST_RELEASED)
-                resulting_key_state = KS_JUST_PRESSED;
-            else if (previous_key_state == KS_JUST_PRESSED ||
-                     previous_key_state == KS_PRESSED)
-                resulting_key_state = KS_PRESSED;
-        }
-        else
-        {
-            if (previous_key_state == KS_PRESSED || previous_key_state == KS_JUST_PRESSED)
-                resulting_key_state = KS_JUST_RELEASED;
-            else if (previous_key_state == KS_JUST_RELEASED ||
-                     previous_key_state == KS_RELEASED)
-                resulting_key_state = KS_RELEASED;
-        }
-        key_states[i] = resulting_key_state;
+        key_states[i].previous = key_states[i].current;
+        key_states[i].current = WalrusRPG::Quirks::get_key(key_map[i].key_code);
     }
 }
 
 bool INPUT::key_pressed(Key key)
 {
-    return key_states[key] == KS_JUST_PRESSED;
+    return !key_states[key].previous && key_states[key].current;
 }
 bool INPUT::key_released(Key key)
 {
-    return key_states[key] == KS_JUST_RELEASED;
+    return key_states[key].previous && !key_states[key].current;
 }
 bool INPUT::key_down(Key key)
 {
-    return key_states[key] == KS_JUST_PRESSED || key_states[key] == KS_PRESSED;
+    return key_states[key].current;
 }
 bool INPUT::key_up(Key key)
 {
-    return key_states[key] == KS_JUST_RELEASED || key_states[key] == KS_RELEASED;
+    return !key_states[key].current;
 }