65 lines
1.7 KiB
C
65 lines
1.7 KiB
C
/* SPDX-License-Identifier: MIT
|
|
* Copyright (c) 2021 KikooDX
|
|
* This file is part of
|
|
* [Painfull Success CG](https://git.sr.ht/~kikoodx/painfull-success-cg),
|
|
* which is MIT licensed. The MIT license requires this copyright notice to be
|
|
* included in all copies and substantial portions of the software. */
|
|
#include <gint/keyboard.h>
|
|
#include "lazyint.h"
|
|
#include "input.h"
|
|
|
|
void input_update(Input *input) {
|
|
/* Read full input stream. */
|
|
clearevents();
|
|
/* For each key, update state. */
|
|
for (u8 i = 0; i < KEYS_COUNT; ++i) {
|
|
u8 *state = &input->states[i];
|
|
const u8 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;
|
|
else
|
|
*state = S_DOWN;
|
|
}
|
|
else {
|
|
if (*state == S_PRESSED || *state == S_DOWN)
|
|
*state = S_RELEASED;
|
|
else
|
|
*state = 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_DOWN] = KEY_DOWN;
|
|
input->keys[K_JUMP] = KEY_SHIFT;
|
|
input->keys[K_RESTART] = KEY_6;
|
|
input->keys[K_EXIT] = KEY_EXIT;
|
|
for (u8 i = 0; i < KEYS_COUNT; ++i)
|
|
input->states[i] = S_UP;
|
|
}
|
|
|
|
bool input_is_pressed(Input input, u8 key) {
|
|
return input.states[key] == S_PRESSED;
|
|
}
|
|
|
|
bool input_is_down(Input input, u8 key) {
|
|
return ((input.states[key] == S_DOWN) ||
|
|
(input.states[key] == S_PRESSED));
|
|
}
|
|
|
|
bool input_is_released(Input input, u8 key) {
|
|
return input.states[key] == S_RELEASED;
|
|
}
|
|
|
|
bool input_is_up(Input input, u8 key) {
|
|
return ((input.states[key] == S_UP) ||
|
|
(input.states[key] == S_RELEASED));
|
|
}
|