diff --git a/CMakeLists.txt b/CMakeLists.txt index 7838667..47b8bdb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,6 +12,7 @@ include_directories(inc) set(SOURCES src/main.c src/draw.c + src/input.c src/player.c ) diff --git a/inc/input.h b/inc/input.h new file mode 100644 index 0000000..2573773 --- /dev/null +++ b/inc/input.h @@ -0,0 +1,16 @@ +#pragma once + +enum Key { K_LEFT, K_RIGHT, K_UP, K_DOWN, K_JUMP, K_EXIT, K_COUNT }; +enum KeyState { KS_UP, KS_DOWN, KS_PRESS }; + +struct Input { + enum Key keys[K_COUNT]; + enum KeyState states[K_COUNT]; +}; + +void input_init(void); +void input_update(void); + +int input_down(enum Key); +int input_pressed(enum Key); +int input_up(enum Key); diff --git a/src/input.c b/src/input.c new file mode 100644 index 0000000..9458444 --- /dev/null +++ b/src/input.c @@ -0,0 +1,48 @@ +#include "input.h" +#include + +static struct Input input; +static const int default_map[K_COUNT] = {KEY_LEFT, KEY_RIGHT, KEY_UP, + KEY_DOWN, KEY_SHIFT, KEY_EXIT}; + +void +input_init(void) +{ + + int i = K_COUNT; + while (i-- > 0) { + input.keys[i] = default_map[i]; + input.states[i] = KS_UP; + } +} + +void +input_update(void) +{ + int i = K_COUNT; + clearevents(); + while (i-- > 0) { + const int kdown = keydown(input.keys[i]); + input.states[i] = (input.states[i] == KS_UP) + ? (kdown ? KS_PRESS : KS_UP) + : (kdown ? KS_DOWN : KS_UP); + } +} + +int +input_down(enum Key k) +{ + return input.states[k] != KS_UP; +} + +int +input_pressed(enum Key k) +{ + return input.states[k] == KS_PRESS; +} + +int +input_up(enum Key k) +{ + return input.states[k] == KS_UP; +} diff --git a/src/main.c b/src/main.c index 0055fcc..b340550 100644 --- a/src/main.c +++ b/src/main.c @@ -1,6 +1,6 @@ +#include "input.h" #include "player.h" #include -#include static Player player; @@ -18,7 +18,7 @@ main(void) do { update(); draw(); - } while (!keydown(KEY_EXIT)); + } while (input_up(K_EXIT)); deinit(); return 0; @@ -27,6 +27,7 @@ main(void) static void init(void) { + input_init(); player_init(&player); } @@ -38,7 +39,7 @@ deinit(void) static void update(void) { - clearevents(); + input_update(); player_update(&player); }