summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKyle K <kylek389@gmail.com>2010-09-28 13:47:05 -0500
committerKamil Kaminski <kamilkss@gmail.com>2010-09-28 13:47:05 -0500
commit2d7b2bb141d20270bcdb19df543c294138164351 (patch)
tree9556c299ecb48d70f741077eab297f56fe9cbe86
parent457a9b1fa973653e3bfb5cf8c5be334c4a6797fd (diff)
downloadGLPyramid-2d7b2bb141d20270bcdb19df543c294138164351.tar.gz
GLPyramid-2d7b2bb141d20270bcdb19df543c294138164351.tar.bz2
GLPyramid-2d7b2bb141d20270bcdb19df543c294138164351.zip
pyramid: handle multiple keys
-rw-r--r--sdl/pyramid.c55
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; }