better input handling
authorterom
Sat, 06 Dec 2008 21:35:36 +0000
changeset 230 78cf0cd69af4
parent 229 355e46effa41
child 231 5085764e1dbb
better input handling
src/Graphics.cc
src/Input.cc
src/Input.hh
--- a/src/Graphics.cc	Sat Dec 06 21:12:30 2008 +0000
+++ b/src/Graphics.cc	Sat Dec 06 21:35:36 2008 +0000
@@ -36,11 +36,8 @@
     if (keyboard.get_keycode(CL_KEY_I))
         player->printDebugInfo();
     
-    // check our keymap
-    for (InputKeymapEntry *e = getGlobalInputKeymap(); e->keycode && e->input; e++) {
-        if (keyboard.get_keycode(e->keycode))
-            input_mask |= e->input;
-    }
+    // build input_mask
+    input_mask = handleInputDevice(keyboard);
     
     // apply input if applicable
     if (input_mask)
--- a/src/Input.cc	Sat Dec 06 21:12:30 2008 +0000
+++ b/src/Input.cc	Sat Dec 06 21:35:36 2008 +0000
@@ -4,19 +4,44 @@
 #include "Input.hh"
 
 static InputKeymapEntry INPUT_KEYMAP[] = {
-    {   CL_KEY_UP,      INPUT_AIM_UP        },
-    {   CL_KEY_DOWN,    INPUT_AIM_DOWN      },
-    {   CL_KEY_LEFT,    INPUT_MOVE_LEFT     },
-    {   CL_KEY_RIGHT,   INPUT_MOVE_RIGHT    },
-    {   CL_KEY_RSHIFT,  INPUT_JUMP          },
-    {   CL_KEY_M,       INPUT_DIG           },
-    {   CL_KEY_F,       INPUT_SHOOT         },
-    {   CL_KEY_D,       INPUT_CHANGE        },
-    {   CL_KEY_R,       INPUT_ROPE          },
-    {   CL_KEY_RSHIFT,  INPUT_UNROPE        },
-    {   0,              (_PlayerInput) 0    }
+    {   -CL_KEY_ENTER,      CL_KEY_UP,      INPUT_AIM_UP        },
+    {   -CL_KEY_ENTER,      CL_KEY_DOWN,    INPUT_AIM_DOWN      },
+    {   -CL_KEY_ENTER,      CL_KEY_LEFT,    INPUT_MOVE_LEFT     },
+    {   -CL_KEY_ENTER,      CL_KEY_RIGHT,   INPUT_MOVE_RIGHT    },
+    {   -CL_KEY_ENTER,      CL_KEY_RSHIFT,  INPUT_JUMP          },
+    {   CL_KEY_LEFT,        CL_KEY_RIGHT,   INPUT_DIG           },
+    {   CL_KEY_RCONTROL,    0,              INPUT_SHOOT         },
+    {   CL_KEY_ENTER,       CL_KEY_LEFT,    INPUT_CHANGE        },
+    {   CL_KEY_ENTER,       CL_KEY_RIGHT,   INPUT_CHANGE        },
+    {   CL_KEY_ENTER,       CL_KEY_RSHIFT,  INPUT_ROPE          },
+    {   -CL_KEY_ENTER,      CL_KEY_RSHIFT,  INPUT_UNROPE        },
+    {   CL_KEY_ENTER,       CL_KEY_UP,      INPUT_ROPE_UP       },
+    {   CL_KEY_ENTER,       CL_KEY_DOWN,    INPUT_ROPE_DOWN     },
+    {   0,                  0,              (_PlayerInput) 0    }
 };
 
 InputKeymapEntry* getGlobalInputKeymap (void) {
     return INPUT_KEYMAP;
 }
+
+static bool _checkInput (CL_InputDevice &keyboard, int keycode) {
+    if (keycode > 0)
+        return keyboard.get_keycode(keycode);
+
+    else if (keycode < 0)
+        return !keyboard.get_keycode(-keycode);
+
+    else // == 0
+        return true;
+}
+
+PlayerInput handleInputDevice (CL_InputDevice &keyboard) {
+    PlayerInput input = 0;
+
+    for (InputKeymapEntry *e = getGlobalInputKeymap(); (e->keycode1 || e->keycode2) && e->input; e++) {
+        if (_checkInput(keyboard, e->keycode1) && _checkInput(keyboard, e->keycode2))
+            input |= e->input;
+    }
+    
+    return input;
+}
--- a/src/Input.hh	Sat Dec 06 21:12:30 2008 +0000
+++ b/src/Input.hh	Sat Dec 06 21:35:36 2008 +0000
@@ -2,6 +2,7 @@
 #define INPUT_HH
 
 #include <stdint.h>
+#include <ClanLib/Display/input_device.h>
 #include <ClanLib/Display/keys.h>
 
 // const uint16_t INPUT_INTERVAL_MS = 20;
@@ -18,13 +19,15 @@
     INPUT_SHOOT         = 0x0040,
     INPUT_CHANGE        = 0x0080,
     INPUT_ROPE          = 0x0100,
-    INPUT_UNROPE        = 0x0200
+    INPUT_UNROPE        = 0x0200,
+    INPUT_ROPE_UP       = 0x0400,
+    INPUT_ROPE_DOWN     = 0x0800,
 };
 
 typedef uint16_t PlayerInput;
 
 struct InputKeymapEntry {
-    int keycode;
+    int keycode1, keycode2;
     enum _PlayerInput input;
 };
 
@@ -33,4 +36,9 @@
  */
 InputKeymapEntry* getGlobalInputKeymap (void);
 
+/*
+ * Handle keycodes
+ */
+PlayerInput handleInputDevice (CL_InputDevice &keyboard);
+
 #endif