This repository has been archived on 2022-01-13. You can view files and clone it, but cannot push or open issues or pull requests.
jtmm2-old/src/input.c

77 lines
2.1 KiB
C

#include <gint/keyboard.h>
#include <gint/display.h>
#include "input.h"
void input_step(Input *input, uint step) {
/* read all inputs */
clearevents();
/* For each key, update it's state and --if needed-- last press
* time. */
for (int i = 0; i < KEYS_COUNT; ++i) {
uint8_t *state = &input->states[i];
const uint8_t key = input->keys[i];
/* see if the key is pressed */
const bool pressed = keydown(key);
/* update input status */
if (pressed) {
if (*state == S_RELEASED || *state == S_UP) {
*state = S_PRESSED;
input->last_press[i] = step;
}
else {
*state = S_DOWN;
}
}
else {
*state = (*state == S_PRESSED || *state == S_DOWN) ? S_RELEASED : S_UP;
}
}
}
void input_init(Input *input) {
/* initialize all values to S_UP, avoid random bugs */
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_JUMP] = KEY_SHIFT;
input->keys[K_EXIT] = KEY_EXIT;
for (int i = 0; i < KEYS_COUNT; ++i) {
input->states[i] = S_UP;
input->last_press[i] = 0;
}
}
void input_draw_debug(Input *input) {
/* debug function that draws all keys state */
for (int i = 0; i < KEYS_COUNT; ++i) {
dprint(0, i * 10, C_BLACK, "%d", i);
dprint(16, i * 10, C_BLACK, "%d", input->states[i]);
dprint(32, i * 10, C_BLACK, "D%d", input_is_down(input, i));
dprint(48, i * 10, C_BLACK, "P%d", input_is_pressed(input, i));
dprint(64, i * 10, C_BLACK, "U%d", input_is_up(input, i));
dprint(80, i * 10, C_BLACK, "R%d", input_is_released(input, i));
}
}
bool input_is_pressed(Input *input, uint8_t key) {
return input->states[key] == S_PRESSED;
}
uint input_last_press(Input *input, uint8_t key, uint step) {
return step - input->last_press[key];
}
bool input_is_down(Input *input, uint8_t key) {
return (input->states[key] == S_DOWN) || (input->states[key] == S_PRESSED);
}
bool input_is_released(Input *input, uint8_t key) {
return input->states[key] == S_RELEASED;
}
bool input_is_up(Input *input, uint8_t key) {
return (input->states[key] == S_UP) || (input->states[key] == S_RELEASED);
}