Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download

Experimento con emscripten y SDL

1178 views
1
#include "input_processor.h"
2
3
bool active_states[GS_NUM_STATES];
4
key_state_binding bindings[MAX_BINDINGS];
5
unsigned int number_of_bindings;
6
7
void input_processor_init()
8
{
9
memset(active_states, 0, GS_QUIT);
10
number_of_bindings = 0;
11
return;
12
}
13
14
int binding_key_compar(const void *v_key, const void *v_member)
15
{
16
const SDL_Keycode *key = v_key;
17
const key_state_binding *member = v_member;
18
19
if (*key < member->k)
20
return -1;
21
if (*key > member->k)
22
return 1;
23
return 0;
24
}
25
26
key_state_binding *search_bindings_by_key(SDL_Keycode k)
27
{
28
key_state_binding *b = bsearch(
29
&k,
30
bindings,
31
number_of_bindings,
32
sizeof(key_state_binding),
33
binding_key_compar);
34
35
if (b == NULL)
36
return NULL;
37
38
key_state_binding *a;
39
40
while (b->k == k) {
41
a = b;
42
b -= 1;
43
}
44
45
return a;
46
}
47
48
bool add_binding(key_state_binding *binding)
49
{
50
if (number_of_bindings + 1 >= MAX_BINDINGS) {
51
fprintf(stderr, "Number of bindings exceeds MAX_BINDINGS\n");
52
return false;
53
}
54
55
key_state_binding *extant_binding = bindings;
56
int i = 0;
57
58
while (binding->k > extant_binding->k && i < number_of_bindings) {
59
extant_binding += 1;
60
i += 1;
61
}
62
63
int num_states_to_move = (number_of_bindings - i);
64
65
memmove(
66
&(bindings[i + 1]),
67
&bindings[i],
68
num_states_to_move * sizeof(key_state_binding));
69
70
bindings[i] = *binding;
71
number_of_bindings += 1;
72
return true;
73
}
74
75
bool rm_binding(key_state_binding *binding)
76
{
77
key_state_binding *b = search_bindings_by_key(binding->k);
78
key_state_binding *b_end =
79
bindings + number_of_bindings * sizeof(key_state_binding);
80
81
if (b == NULL)
82
return true;
83
84
while (b->k == binding->k && b != b_end) {
85
if (b->s == binding->s && b->t == binding->t) {
86
int i = (b - bindings) / sizeof(key_state_binding);
87
int num_states_to_move = (number_of_bindings - 1 - i);
88
89
memmove(
90
b,
91
b + 1,
92
num_states_to_move * sizeof(key_state_binding));
93
number_of_bindings -= 1;
94
b_end =
95
bindings + number_of_bindings * sizeof(key_state_binding);
96
b--;
97
}
98
b++;
99
}
100
return true;
101
}
102
103
void process_event(SDL_Event *event)
104
{
105
SDL_Keycode key = event->key.keysym.sym;
106
107
key_state_binding *b = search_bindings_by_key(key);
108
key_state_binding *b_end =
109
bindings + number_of_bindings * sizeof(key_state_binding);
110
111
if (b == NULL)
112
return;
113
114
while (b->k == key && b != b_end) {
115
if (event->key.type == SDL_KEYDOWN) {
116
if (b->t == BINDING_ATOMIC && is_state_active(b->s)) {
117
deactivate_state(b->s);
118
b++;
119
continue;
120
}
121
activate_state(b->s);
122
b++;
123
continue;
124
}
125
126
if (event->key.type == SDL_KEYUP && b->t == BINDING_CONTINUOUS)
127
deactivate_state(b->s);
128
b++;
129
}
130
}
131
132
void process_input()
133
{
134
SDL_Event event;
135
136
while (SDL_PollEvent(&event)) {
137
if (event.type == SDL_QUIT) {
138
active_states[GS_QUIT] = true;
139
}
140
process_event(&event);
141
}
142
}
143
144
void activate_state(game_state state)
145
{
146
active_states[state] = true;
147
}
148
149
void deactivate_state(game_state state)
150
{
151
active_states[state] = false;
152
}
153
154
bool is_state_active(game_state state)
155
{
156
return active_states[state];
157
}
158
159
bool test_add_binding()
160
{
161
bool passed_test = true;
162
163
key_state_binding ksb1;
164
ksb1.k = SDLK_a;
165
ksb1.s = GS_ONE;
166
ksb1.t = BINDING_ATOMIC;
167
168
add_binding(&ksb1);
169
170
ksb1.k = SDLK_b;
171
ksb1.s = GS_ONE;
172
173
add_binding(&ksb1);
174
175
ksb1.k = SDLK_a;
176
ksb1.s=GS_TWO;
177
178
add_binding(&ksb1);
179
180
if (number_of_bindings != 3) {
181
passed_test = false;
182
}
183
184
if (bindings[2].k != SDLK_b || bindings[2].s != GS_ONE) {
185
passed_test = false;
186
}
187
188
if (bindings[0].k != SDLK_a || bindings[1].k != SDLK_a) {
189
passed_test = false;
190
}
191
192
if (!passed_test) {
193
fprintf(stderr, "add_binding test failed\n");
194
}
195
196
return passed_test;
197
}
198
199
bool test_rm_binding()
200
{
201
bool passed_test = true;
202
203
key_state_binding ksb1;
204
ksb1.k = SDLK_a;
205
ksb1.s = GS_TWO;
206
ksb1.t = BINDING_ATOMIC;
207
208
rm_binding(&ksb1);
209
210
if (number_of_bindings != 2) {
211
passed_test = false;
212
}
213
214
if (bindings[1].k != SDLK_b || bindings[1].s != GS_ONE) {
215
passed_test = false;
216
}
217
218
rm_binding(&ksb1);
219
220
ksb1.s = GS_ONE;
221
rm_binding(&ksb1);
222
223
if (number_of_bindings != 1) {
224
passed_test = false;
225
}
226
227
if (bindings[0].k != SDLK_b || bindings[0].s != GS_ONE) {
228
passed_test = false;
229
}
230
231
ksb1.k = SDLK_b;
232
rm_binding(&ksb1);
233
if (number_of_bindings != 0) {
234
passed_test = false;
235
}
236
237
if (!passed_test) {
238
fprintf(stderr, "rm_binding test failed\n");
239
}
240
241
return passed_test;
242
}
243
244
bool test_process_event()
245
{
246
bool passed_test = true;
247
248
249
key_state_binding ksb1;
250
ksb1.k = SDLK_a;
251
ksb1.s = GS_TWO;
252
ksb1.t = BINDING_ATOMIC;
253
add_binding(&ksb1);
254
255
SDL_Event e;
256
e.key.keysym.sym = SDLK_a;
257
e.key.type = SDL_KEYDOWN;
258
259
process_event(&e);
260
261
if (!is_state_active(GS_TWO)) {
262
passed_test = false;
263
}
264
265
if (!passed_test) {
266
fprintf(stderr, "process_event test failed\n");
267
}
268
269
return passed_test;
270
}
271
272
bool test_input_processor()
273
{
274
test_add_binding();
275
test_rm_binding();
276
test_process_event();
277
fprintf(stderr, "tests pass\n");
278
return true;
279
}
280
281