From c333b69113eb3b1cb98bec74bd69647a4252c27c Mon Sep 17 00:00:00 2001 From: KikooDX Date: Tue, 9 Nov 2021 22:34:40 +0100 Subject: [PATCH] input manager --- CMakeLists.txt | 3 ++- Makefile | 7 ++++-- inc/input.h | 21 ++++++++++++++++ src/input.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.c | 10 +++++--- 5 files changed, 103 insertions(+), 6 deletions(-) create mode 100644 inc/input.h create mode 100644 src/input.c diff --git a/CMakeLists.txt b/CMakeLists.txt index cacd31c..642d3fa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,10 +9,11 @@ include(Fxconv) find_package(Gint 2.6.0 REQUIRED) -include_directories(include) +include_directories(inc) set(SOURCES src/main.c + src/input.c ) set(LEVELS diff --git a/Makefile b/Makefile index 37262b4..6999851 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,11 @@ -all: +all: format fxsdk build-cg +format: + clang-format -style=file -i src/**.c inc/**.h + clean: rm -rf build-cg/ rm -f *.g3a -.PHONY: clean +.PHONY: format clean diff --git a/inc/input.h b/inc/input.h new file mode 100644 index 0000000..d73de49 --- /dev/null +++ b/inc/input.h @@ -0,0 +1,21 @@ +#pragma once +/* use this to get user input, NOT gint/keyboard.h */ + +enum Key { K_A, K_B, K_UP, K_DOWN, K_LEFT, K_RIGHT, K_EXIT, K_COUNT }; +enum KeyState { KS_UP, KS_RELEASE, KS_DOWN, KS_PRESS }; + +struct Input { + int keys[K_COUNT]; + enum KeyState states[K_COUNT]; +}; + +/* called by main.c once */ +void input_init(void); + +/* call this to update key states once per frame */ +void input_update(void); + +int input_down(enum Key); +int input_pressed(enum Key); +int input_up(enum Key); +int input_released(enum Key); diff --git a/src/input.c b/src/input.c new file mode 100644 index 0000000..4f3cbda --- /dev/null +++ b/src/input.c @@ -0,0 +1,68 @@ +#include "input.h" +#include + +static struct Input input; + +void +input_init(void) +{ + int i = K_COUNT; + while (i-- > 0) { + input.states[i] = KS_UP; + } + input.keys[K_A] = KEY_SHIFT; + input.keys[K_B] = KEY_ALPHA; + input.keys[K_LEFT] = KEY_LEFT; + input.keys[K_RIGHT] = KEY_RIGHT; + input.keys[K_UP] = KEY_UP; + input.keys[K_DOWN] = KEY_DOWN; + input.keys[K_EXIT] = KEY_EXIT; +} + +void +input_update(void) +{ + int i = K_COUNT; + clearevents(); + while (i-- > 0) { + const int kdown = keydown(input.keys[i]); + enum KeyState *const state = &input.states[i]; + const enum KeyState prev_state = input.states[i]; + switch (prev_state) { + case KS_UP: + case KS_RELEASE: + *state = (kdown) ? (KS_PRESS) : (KS_UP); + break; + case KS_DOWN: + case KS_PRESS: + *state = (kdown) ? (KS_DOWN) : (KS_RELEASE); + break; + default: + break; + } + } +} + +int +input_down(enum Key k) +{ + return input.states[k] == KS_DOWN || input.states[k] == KS_PRESS; +} + +int +input_pressed(enum Key k) +{ + return input.states[k] == KS_PRESS; +} + +int +input_up(enum Key k) +{ + return !input_down(k); +} + +int +input_released(enum Key k) +{ + return input.states[k] == KS_RELEASE; +} diff --git a/src/main.c b/src/main.c index e79e87f..cccc79d 100644 --- a/src/main.c +++ b/src/main.c @@ -1,6 +1,10 @@ -#include +#include "input.h" -int main(void) { - getkey(); +int +main(void) +{ + input_init(); + while (!input_pressed(K_EXIT)) + input_update(); return 1; }