diff options
Diffstat (limited to 'sdl/event.c')
-rw-r--r-- | sdl/event.c | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/sdl/event.c b/sdl/event.c new file mode 100644 index 0000000..e6c4c00 --- /dev/null +++ b/sdl/event.c @@ -0,0 +1,128 @@ +/* event.c + * + * Event Handler + * + * notes: I would be useful to create a following function + * register_signal(SDL_HOLDDOWN, EVENT_ACTION_INCR, float *p, float val) + * + * struct platform is still passed globally + * + */ + +#include <SDL/SDL.h> +#include <SDL/SDL_image.h> +#include "client.h" +#include "glframe.h" +#include "platform.h" +#include "window.h" +#include "event.h" + +extern struct platform p; +extern int program_running; + +/* process SDL events */ +void sdl_process_events(void) +{ + SDL_Event event; + SDLKey sym; + static unsigned int keys_held[323]; + + /* helper flag for event_keydown() */ + int flag = 0; + + while (SDL_PollEvent(&event)) + { + sym = event.key.keysym.sym; + + switch (event.type) + { + /* keyboard event */ + case SDL_KEYUP: + { + /* reset the key to 0 */ + keys_held[sym] = 0; + break; + } + case SDL_KEYDOWN: + { + keys_held[sym] = 1; + event_keydown(&event.key.keysym, keys_held, flag); + break; + } + case SDL_VIDEORESIZE: + { + window_resize(event.resize.w, event.resize.h); + break; + } + case SDL_QUIT: + { + program_running = 0; + break; + } + default: + break; + } + } + + /* 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]) + { + flag = !flag; + event_keydown(NULL, keys_held, flag); + } + else + flag = !flag; +} + +void event_keydown(SDL_keysym *keysym, const unsigned int *keys_held, const int flag) +{ + 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 + { + if (keys_held[SDLK_w]) + p.c->xrot -= 5.0f; + if (keys_held[SDLK_s]) + p.c->xrot += 5.0f; + if (keys_held[SDLK_a]) + p.c->yrot -= 5.0f; + if (keys_held[SDLK_d]) + p.c->yrot += 5.0f; + + if (keys_held[SDLK_UP]) + glframe_move_forward(&p.camera, 0.05f); + if (keys_held[SDLK_DOWN]) + glframe_move_forward(&p.camera, -0.05f); + if (keys_held[SDLK_LEFT]) + glframe_rotate_local_y(&p.camera, 0.02f); + if (keys_held[SDLK_RIGHT]) + glframe_rotate_local_y(&p.camera, -0.02f); + + if (keys_held[SDLK_n]) + glframe_rotate_local_x(&p.camera, 0.02f); + if (keys_held[SDLK_m]) + glframe_rotate_local_x(&p.camera, -0.02f); + } + + p.c->xrot = (GLfloat) ((const int) p.c->xrot % 360); + p.c->yrot = (GLfloat) ((const int) p.c->yrot % 360); +} + |