input manager

This commit is contained in:
KikooDX 2021-11-09 22:34:40 +01:00
parent 7636abbeb8
commit c333b69113
5 changed files with 103 additions and 6 deletions

View File

@ -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

View File

@ -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

21
inc/input.h Normal file
View File

@ -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);

68
src/input.c Normal file
View File

@ -0,0 +1,68 @@
#include "input.h"
#include <gint/keyboard.h>
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;
}

View File

@ -1,6 +1,10 @@
#include <gint/keyboard.h>
#include "input.h"
int main(void) {
getkey();
int
main(void)
{
input_init();
while (!input_pressed(K_EXIT))
input_update();
return 1;
}