input buffering for 8 frames

This commit is contained in:
Lephenixnoir 2023-06-01 01:36:49 +02:00
parent 4b835efb83
commit 953634b967
Signed by: Lephenixnoir
GPG Key ID: 1BBA026E13FC0495
1 changed files with 41 additions and 36 deletions

View File

@ -41,6 +41,9 @@ int play_level(int level_id)
player->frame = 0;
player->energy_percent = 0.0;
/* Input buffering */
struct { int left, right, up, shift; } keybuffer = {};
/* FPS regulation setup */
int volatile need_frame = 1;
int last_frame_us = 0;
@ -144,6 +147,7 @@ int play_level(int level_id)
//======= Input =======//
key_event_t ev;
while((ev = pollevent()).type != KEYEV_NONE) {
if(ev.type == KEYEV_UP || ev.type == KEYEV_HOLD)
continue;
@ -153,46 +157,47 @@ int play_level(int level_id)
game_run = false;
if(key == KEY_OPTN)
game.debug.footer = !game.debug.footer;
if(key == KEY_F1) {
game.level = level_create(1);
level_update(&game.level, game.player.z);
}
if(key == KEY_F2) {
game.level = level_create(2);
level_update(&game.level, game.player.z);
}
if(key == KEY_F3) {
game.level = level_create(3);
level_update(&game.level, game.player.z);
}
if(key == KEY_LEFT && !player->airborne()) {
player->stance = player::Jumping;
player->jump_dir = -1;
player->jump_t = 0.0;
player->jump_key = key;
player->vheight = JUMP_THRUST;
player->frame = 0;
}
if((key == KEY_UP || key == KEY_SHIFT) && !player->airborne()) {
player->stance = player::Jumping;
player->jump_dir = 0;
player->jump_t = 0.0;
player->jump_key = key;
player->vheight = JUMP_THRUST;
player->frame = 0;
}
if(key == KEY_RIGHT && !player->airborne()) {
player->stance = player::Jumping;
player->jump_dir = +1;
player->jump_t = 0.0;
player->jump_key = key;
player->vheight = JUMP_THRUST;
player->frame = 0;
}
if(key == KEY_LEFT)
keybuffer.left = 8;
if(key == KEY_RIGHT)
keybuffer.right = 8;
if(key == KEY_UP)
keybuffer.up = 8;
if(key == KEY_SHIFT)
keybuffer.shift = 8;
}
if(!game_run) break;
int key = keybuffer.left ? KEY_LEFT :
keybuffer.right ? KEY_RIGHT :
keybuffer.up ? KEY_UP :
keybuffer.shift ? KEY_SHIFT : 0;
if(key && !player->airborne()) {
player->stance = player::Jumping;
player->jump_dir = (key == KEY_RIGHT) - (key == KEY_LEFT);
player->jump_t = 0.0;
player->jump_key = key;
player->vheight = JUMP_THRUST;
player->frame = 0;
keybuffer.left = 0;
keybuffer.right = 0;
keybuffer.up = 0;
keybuffer.shift = 0;
}
if(keybuffer.left > 0)
keybuffer.left--;
if(keybuffer.right > 0)
keybuffer.right--;
if(keybuffer.up > 0)
keybuffer.up--;
if(keybuffer.shift > 0)
keybuffer.shift--;
//======= Simulation =======//
num vz = player->vz * (num(1) + player->energy_percent / 200);