1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
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);
}
|