From 43674e2b8fe819213b67d6381c5caa8772d5233f Mon Sep 17 00:00:00 2001 From: Kyle K Date: Tue, 19 Jul 2011 10:27:16 -0500 Subject: sdl: reworked event handler a bit, still thinking about C++ --- sdl/event.c | 83 +++++++++++++++++++++++++++++++------------------------------ sdl/event.h | 13 ++++++++-- 2 files changed, 53 insertions(+), 43 deletions(-) diff --git a/sdl/event.c b/sdl/event.c index 16e5f00..905a35f 100644 --- a/sdl/event.c +++ b/sdl/event.c @@ -18,22 +18,21 @@ #include "event.h" extern int program_running; -static struct platform *p; -/* our function table */ -static struct event_vtbl event_tbl; +/* an event handler struct that contains a table with function pointers */ +static struct event_handler event_handler; int event_handler_init(struct platform *plat, struct event_vtbl *tbl) { if (!tbl || !plat) return -1; - p = plat; - event_tbl = *tbl; + event_handler.funcs = *tbl; + event_handler.p = plat; /* predefined handlers that are automatically provided */ - if (!event_tbl.windowresize) - event_tbl.windowresize = window_resize; + if (!event_handler.funcs.windowresize) + event_handler.funcs.windowresize = window_resize; return 0; } @@ -43,10 +42,9 @@ void sdl_process_events(void) { SDL_Event event; SDLKey sym; - static unsigned int keys_held[323]; + unsigned int *keys_held = event_handler.keys_held; - /* helper flag for event_keydown() */ - int flag = 0; + event_handler.flag = 0; while (SDL_PollEvent(&event)) { @@ -64,14 +62,14 @@ void sdl_process_events(void) case SDL_KEYDOWN: { keys_held[sym] = 1; - if (event_tbl.keydown) - event_tbl.keydown(&event.key.keysym, keys_held, flag); + if (event_handler.funcs.keydown) + event_handler.funcs.keydown(&event.key.keysym); break; } case SDL_VIDEORESIZE: { - if (event_tbl.windowresize) - event_tbl.windowresize(event.resize.w, event.resize.h); + if (event_handler.funcs.windowresize) + event_handler.funcs.windowresize(event.resize.w, event.resize.h); break; } case SDL_QUIT: @@ -85,39 +83,24 @@ void sdl_process_events(void) } /* below code has to be placed here, check for keys that are being constantly held */ - if (keys_held[SDLK_w] || keys_held[SDLK_s] || keys_held[SDLK_a] || keys_held[SDLK_d] || - keys_held[SDLK_UP] || keys_held[SDLK_DOWN] || keys_held[SDLK_LEFT] || keys_held[SDLK_RIGHT] || - keys_held[SDLK_n] || keys_held[SDLK_m]) + if (keys_held[SDLK_w] || keys_held[SDLK_s] || keys_held[SDLK_a] || + keys_held[SDLK_d] || keys_held[SDLK_UP] || keys_held[SDLK_DOWN] || + keys_held[SDLK_LEFT] || keys_held[SDLK_RIGHT] || keys_held[SDLK_n] || + keys_held[SDLK_m]) { - flag = !flag; - event_keydown(NULL, keys_held, flag); + event_handler.flag = !event_handler.flag; + event_keydown(NULL); } - else - flag = !flag; } /* here are the event handler functions */ -void event_keydown(SDL_keysym *keysym, const unsigned int *keys_held, const int flag) +void event_keydown(SDL_keysym *keysym) { - if (!flag) - { - switch (keysym->sym) - { - case SDLK_ESCAPE: program_running = 0; break; - case SDLK_w: p->c->xrot -= 5.0f; break; - case SDLK_s: p->c->xrot += 5.0f; break; - case SDLK_a: p->c->yrot -= 5.0f; break; - case SDLK_d: p->c->yrot += 5.0f; break; - case SDLK_UP: glframe_move_forward(&p->camera, 0.5f); break; - case SDLK_DOWN: glframe_move_forward(&p->camera, -0.5f); break; - case SDLK_LEFT: glframe_rotate_local_y(&p->camera, 0.1f); break; - case SDLK_RIGHT: glframe_rotate_local_y(&p->camera, -0.1f); break; - case SDLK_n: glframe_rotate_local_x(&p->camera, 0.1f); break; - case SDLK_m: glframe_rotate_local_x(&p->camera, -0.1f); break; - default: break; - } - } - else + const unsigned int *keys_held = event_handler.keys_held; + struct platform *p = event_handler.p; + + /* a flag is toggled on if the we are interested in keys that are being held */ + if (event_handler.flag) { if (keys_held[SDLK_w]) p->c->xrot -= 5.0f; @@ -142,6 +125,24 @@ void event_keydown(SDL_keysym *keysym, const unsigned int *keys_held, const int if (keys_held[SDLK_m]) glframe_rotate_local_x(&p->camera, -0.02f); } + else + { + switch (keysym->sym) + { + case SDLK_ESCAPE: program_running = 0; break; + case SDLK_w: p->c->xrot -= 5.0f; break; + case SDLK_s: p->c->xrot += 5.0f; break; + case SDLK_a: p->c->yrot -= 5.0f; break; + case SDLK_d: p->c->yrot += 5.0f; break; + case SDLK_UP: glframe_move_forward(&p->camera, 0.5f); break; + case SDLK_DOWN: glframe_move_forward(&p->camera, -0.5f); break; + case SDLK_LEFT: glframe_rotate_local_y(&p->camera, 0.1f); break; + case SDLK_RIGHT: glframe_rotate_local_y(&p->camera, -0.1f); break; + case SDLK_n: glframe_rotate_local_x(&p->camera, 0.1f); break; + case SDLK_m: glframe_rotate_local_x(&p->camera, -0.1f); break; + default: break; + } + } p->c->xrot = (GLfloat) ((const int) p->c->xrot % 360); p->c->yrot = (GLfloat) ((const int) p->c->yrot % 360); diff --git a/sdl/event.h b/sdl/event.h index 0608fa7..b6a1084 100644 --- a/sdl/event.h +++ b/sdl/event.h @@ -6,14 +6,23 @@ struct platform; /* a table holding function pointers to functions that handle events */ struct event_vtbl { - void (*keydown)(SDL_keysym *, const unsigned int *, const int); + void (*keydown)(SDL_keysym *); void (*windowresize)(int, int); }; +struct event_handler +{ + struct event_vtbl funcs; /* table of event function handlers */ + unsigned int keys_held[323]; /* keep track of the keys that were held */ + + struct platform *p; /* reference to the host platform */ + int flag; /* helper flag */ +}; + /* function prototypes */ int event_handler_init(struct platform *, struct event_vtbl *); void sdl_process_events(void); -void event_keydown(SDL_keysym *, const unsigned int *, const int); +void event_keydown(SDL_keysym *); #endif -- cgit v1.2.3