Experimento con emscripten y SDL
#include "input_processor.h"12bool active_states[GS_NUM_STATES];3key_state_binding bindings[MAX_BINDINGS];4unsigned int number_of_bindings;56void input_processor_init()7{8memset(active_states, 0, GS_QUIT);9number_of_bindings = 0;10return;11}1213int binding_key_compar(const void *v_key, const void *v_member)14{15const SDL_Keycode *key = v_key;16const key_state_binding *member = v_member;1718if (*key < member->k)19return -1;20if (*key > member->k)21return 1;22return 0;23}2425key_state_binding *search_bindings_by_key(SDL_Keycode k)26{27key_state_binding *b = bsearch(28&k,29bindings,30number_of_bindings,31sizeof(key_state_binding),32binding_key_compar);3334if (b == NULL)35return NULL;3637key_state_binding *a;3839while (b->k == k) {40a = b;41b -= 1;42}4344return a;45}4647bool add_binding(key_state_binding *binding)48{49if (number_of_bindings + 1 >= MAX_BINDINGS) {50fprintf(stderr, "Number of bindings exceeds MAX_BINDINGS\n");51return false;52}5354key_state_binding *extant_binding = bindings;55int i = 0;5657while (binding->k > extant_binding->k && i < number_of_bindings) {58extant_binding += 1;59i += 1;60}6162int num_states_to_move = (number_of_bindings - i);6364memmove(65&(bindings[i + 1]),66&bindings[i],67num_states_to_move * sizeof(key_state_binding));6869bindings[i] = *binding;70number_of_bindings += 1;71return true;72}7374bool rm_binding(key_state_binding *binding)75{76key_state_binding *b = search_bindings_by_key(binding->k);77key_state_binding *b_end =78bindings + number_of_bindings * sizeof(key_state_binding);7980if (b == NULL)81return true;8283while (b->k == binding->k && b != b_end) {84if (b->s == binding->s && b->t == binding->t) {85int i = (b - bindings) / sizeof(key_state_binding);86int num_states_to_move = (number_of_bindings - 1 - i);8788memmove(89b,90b + 1,91num_states_to_move * sizeof(key_state_binding));92number_of_bindings -= 1;93b_end =94bindings + number_of_bindings * sizeof(key_state_binding);95b--;96}97b++;98}99return true;100}101102void process_event(SDL_Event *event)103{104SDL_Keycode key = event->key.keysym.sym;105106key_state_binding *b = search_bindings_by_key(key);107key_state_binding *b_end =108bindings + number_of_bindings * sizeof(key_state_binding);109110if (b == NULL)111return;112113while (b->k == key && b != b_end) {114if (event->key.type == SDL_KEYDOWN) {115if (b->t == BINDING_ATOMIC && is_state_active(b->s)) {116deactivate_state(b->s);117b++;118continue;119}120activate_state(b->s);121b++;122continue;123}124125if (event->key.type == SDL_KEYUP && b->t == BINDING_CONTINUOUS)126deactivate_state(b->s);127b++;128}129}130131void process_input()132{133SDL_Event event;134135while (SDL_PollEvent(&event)) {136if (event.type == SDL_QUIT) {137active_states[GS_QUIT] = true;138}139process_event(&event);140}141}142143void activate_state(game_state state)144{145active_states[state] = true;146}147148void deactivate_state(game_state state)149{150active_states[state] = false;151}152153bool is_state_active(game_state state)154{155return active_states[state];156}157158bool test_add_binding()159{160bool passed_test = true;161162key_state_binding ksb1;163ksb1.k = SDLK_a;164ksb1.s = GS_ONE;165ksb1.t = BINDING_ATOMIC;166167add_binding(&ksb1);168169ksb1.k = SDLK_b;170ksb1.s = GS_ONE;171172add_binding(&ksb1);173174ksb1.k = SDLK_a;175ksb1.s=GS_TWO;176177add_binding(&ksb1);178179if (number_of_bindings != 3) {180passed_test = false;181}182183if (bindings[2].k != SDLK_b || bindings[2].s != GS_ONE) {184passed_test = false;185}186187if (bindings[0].k != SDLK_a || bindings[1].k != SDLK_a) {188passed_test = false;189}190191if (!passed_test) {192fprintf(stderr, "add_binding test failed\n");193}194195return passed_test;196}197198bool test_rm_binding()199{200bool passed_test = true;201202key_state_binding ksb1;203ksb1.k = SDLK_a;204ksb1.s = GS_TWO;205ksb1.t = BINDING_ATOMIC;206207rm_binding(&ksb1);208209if (number_of_bindings != 2) {210passed_test = false;211}212213if (bindings[1].k != SDLK_b || bindings[1].s != GS_ONE) {214passed_test = false;215}216217rm_binding(&ksb1);218219ksb1.s = GS_ONE;220rm_binding(&ksb1);221222if (number_of_bindings != 1) {223passed_test = false;224}225226if (bindings[0].k != SDLK_b || bindings[0].s != GS_ONE) {227passed_test = false;228}229230ksb1.k = SDLK_b;231rm_binding(&ksb1);232if (number_of_bindings != 0) {233passed_test = false;234}235236if (!passed_test) {237fprintf(stderr, "rm_binding test failed\n");238}239240return passed_test;241}242243bool test_process_event()244{245bool passed_test = true;246247248key_state_binding ksb1;249ksb1.k = SDLK_a;250ksb1.s = GS_TWO;251ksb1.t = BINDING_ATOMIC;252add_binding(&ksb1);253254SDL_Event e;255e.key.keysym.sym = SDLK_a;256e.key.type = SDL_KEYDOWN;257258process_event(&e);259260if (!is_state_active(GS_TWO)) {261passed_test = false;262}263264if (!passed_test) {265fprintf(stderr, "process_event test failed\n");266}267268return passed_test;269}270271bool test_input_processor()272{273test_add_binding();274test_rm_binding();275test_process_event();276fprintf(stderr, "tests pass\n");277return true;278}279280281