From 2d7b2bb141d20270bcdb19df543c294138164351 Mon Sep 17 00:00:00 2001 From: Kyle K Date: Tue, 28 Sep 2010 13:47:05 -0500 Subject: pyramid: handle multiple keys --- sdl/pyramid.c | 55 +++++++++++++++++++++++++++++++++++++++++-------------- 1 file 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; } -- cgit v1.2.3