# HG changeset patch # User terom # Date 1228599336 0 # Node ID 78cf0cd69af4cb3a20de01f2d9311f95676eac9c # Parent 355e46effa410a336f3e6bac55add7bf6d46c543 better input handling diff -r 355e46effa41 -r 78cf0cd69af4 src/Graphics.cc --- 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) diff -r 355e46effa41 -r 78cf0cd69af4 src/Input.cc --- 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; +} diff -r 355e46effa41 -r 78cf0cd69af4 src/Input.hh --- 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 +#include #include // 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