diff --git a/src/main.cpp b/src/main.cpp index 7c23442..9d6bb44 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -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);