diff options
author | Kyle K <kylek389@gmail.com> | 2010-09-28 13:47:05 -0500 |
---|---|---|
committer | Kamil Kaminski <kamilkss@gmail.com> | 2010-09-28 13:47:05 -0500 |
commit | 2d7b2bb141d20270bcdb19df543c294138164351 (patch) | |
tree | 9556c299ecb48d70f741077eab297f56fe9cbe86 | |
parent | 457a9b1fa973653e3bfb5cf8c5be334c4a6797fd (diff) | |
download | GLPyramid-2d7b2bb141d20270bcdb19df543c294138164351.tar.gz GLPyramid-2d7b2bb141d20270bcdb19df543c294138164351.tar.bz2 GLPyramid-2d7b2bb141d20270bcdb19df543c294138164351.zip |
pyramid: handle multiple keys
-rw-r--r-- | sdl/pyramid.c | 55 |
1 files changed, 41 insertions, 14 deletions
diff --git a/sdl/pyramid.c b/sdl/pyramid.c index dd15225..c3301e8 100644 --- a/sdl/pyramid.c +++ b/sdl/pyramid.c @@ -85,16 +85,30 @@ static void SetupRC() glEnable(GL_TEXTURE_2D); } -static void keys(SDL_keysym *keysym) +static void keys(SDL_keysym *keysym, unsigned int *keys_held, int flag) { - switch (keysym->sym) + if (!flag) { - case SDLK_ESCAPE: exit(0); break; - case SDLK_w: xRot -= 5.0f; break; - case SDLK_s: xRot += 5.0f; break; - case SDLK_a: yRot -= 5.0f; break; - case SDLK_d: yRot += 5.0f; break; - default: break; + switch (keysym->sym) + { + case SDLK_ESCAPE: exit(0); break; + case SDLK_w: xRot -= 5.0f; break; + case SDLK_s: xRot += 5.0f; break; + case SDLK_a: yRot -= 5.0f; break; + case SDLK_d: yRot += 5.0f; break; + default: break; + } + } + else + { + if (keys_held[SDLK_w]) + xRot -= 5.0f; + if (keys_held[SDLK_s]) + xRot += 5.0f; + if (keys_held[SDLK_a]) + yRot -= 5.0f; + if (keys_held[SDLK_d]) + yRot += 5.0f; } xRot = (GLfloat) ((const int) xRot % 360); @@ -105,23 +119,36 @@ static void keys(SDL_keysym *keysym) void processEvents() { SDL_Event event; - unsigned static int m_Keys[SDLK_LAST]; - SDLKey sym = event.key.keysym.sym; + unsigned static int keys_held[323]; + SDLKey sym; + /* helper flag for keys() */ + int flag = 0; + + /* check for keys that are being constantly pressed */ + if (keys_held[SDLK_w] || keys_held[SDLK_s] || keys_held[SDLK_a] || keys_held[SDLK_d]) + { + flag = !flag; + keys(NULL, keys_held, flag); + } + else + flag = !flag; while (SDL_PollEvent(&event)) { + sym = event.key.keysym.sym; + switch (event.type) { case SDL_KEYUP: { - m_Keys[sym] = 0; - keys(&event.key.keysym); + /* reset the key to 0 */ + keys_held[sym] = 0; break; } case SDL_KEYDOWN: { - m_Keys[sym] = 1; - keys(&event.key.keysym); + keys_held[sym] = 1; + keys(&event.key.keysym, keys_held, flag); break; } case SDL_VIDEORESIZE: { resize(event.resize.w, event.resize.h); break; } |