Mid-air jumps ('bursts')

It feels great. I love it.
This commit is contained in:
KikooDX 2021-04-03 23:49:14 +02:00
parent 968eb3d96c
commit ae1fbb12b5
8 changed files with 30 additions and 61 deletions

View File

@ -23,7 +23,7 @@ set(SOURCES
set(ASSETS
assets/graphics/tileset.png
assets/graphics/player.png
assets/graphics/drill.png
assets/graphics/burst.png
)
set(FLAGS

View File

Before

Width:  |  Height:  |  Size: 804 B

After

Width:  |  Height:  |  Size: 804 B

View File

@ -4,6 +4,6 @@ tileset.png:
player.png:
type: bopti-image
name: bimg_player
drill.png:
burst.png:
type: bopti-image
name: bimg_drill
name: bimg_burst

View File

@ -14,5 +14,7 @@
#define AIR_RES 0.02
#define GRAVITY 0.2
#define JUMP_SPD -4.2
#define AIR_JMP_SPD -3.0
#define JUMP_BUFFER 10
#define JUMP_GRACE 10
#define AIR_JUMPS 2

View File

@ -10,8 +10,6 @@
enum AirState { AirRising, AirBreaking, AirNeutral };
#define AIR_BREAKING_FACTOR 3
enum DrillState { DrillCharged, DrillPowered, DrillEmpty };
struct Player {
int x;
int y;
@ -23,12 +21,8 @@ struct Player {
int k_jump_previous;
int jump_buffer;
int jump_grace;
int jumps_left;
enum AirState air_state;
/* drill */
int k_drill_previous;
float drill_x;
float drill_y;
enum DrillState drill_state;
};
/* used for collisions */

View File

@ -1,17 +1,17 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/* Copyright (C) 2021 KikooDX */
#include "conf.h"
#include "player.h"
#include <gint/display.h>
extern bopti_image_t bimg_player;
extern bopti_image_t bimg_drill;
extern bopti_image_t bimg_burst;
void player_draw(struct Player player)
{
dimage(player.x, player.y, &bimg_player);
if (player.drill_state == DrillPowered)
dimage(player.x + PLAYER_WIDTH * player.drill_x,
player.y + PLAYER_HEIGHT * player.drill_y,
&bimg_drill);
if (player.air_state == AirRising &&
player.jumps_left < AIR_JUMPS)
dimage(player.x, player.y + PLAYER_HEIGHT, &bimg_burst);
}

View File

@ -20,11 +20,8 @@ struct Player player_init(void)
.k_jump_previous = 0,
.jump_buffer = 0,
.jump_grace = 0,
.jumps_left = 0,
.air_state = AirNeutral,
.k_drill_previous = 0,
.drill_x = 0,
.drill_y = 0,
.drill_state = DrillEmpty,
};
/* find spawn position in level */

View File

@ -6,8 +6,6 @@
#include "tiles.h"
#include <gint/keyboard.h>
#define SQRT_0_5 0.707107
static void player_move(struct Player *player, int x, int y);
/* return 1 if exit reached, -1 on death/reset and 0 otherwise */
@ -19,13 +17,10 @@ int player_update(struct Player *player)
/* process input */
const int dir_x = keydown(KEY_RIGHT) - keydown(KEY_LEFT);
const int dir_y = keydown(KEY_DOWN) - keydown(KEY_UP);
/* const int dir_y = keydown(KEY_DOWN) - keydown(KEY_UP); */
const int k_jump = keydown(KEY_SHIFT);
const int kp_jump = k_jump && (!player->k_jump_previous);
player->k_jump_previous = k_jump;
const int k_drill = keydown(KEY_ALPHA);
const int kp_drill = k_drill && (!player->k_drill_previous);
player->k_drill_previous = k_drill;
/* horizontal friction/acceleration */
player->spd_x *= (on_ground) ? (1 - FRC_GND) : (1 - FRC_AIR);
@ -70,47 +65,28 @@ int player_update(struct Player *player)
player->jump_buffer = JUMP_BUFFER;
else if (player->jump_buffer)
player->jump_buffer -= 1;
/* grace frames */
if (on_ground)
/* grace frames and jumps refill */
if (on_ground) {
player->jump_grace = JUMP_GRACE;
else if (player->jump_grace)
player->jumps_left = AIR_JUMPS;
} else if (player->jump_grace)
player->jump_grace -= 1;
/* jump (youhou) */
if (k_jump && player->jump_buffer && player->jump_grace) {
player->air_state = AirRising;
player->spd_y = JUMP_SPD;
player->jump_buffer = 0;
player->jump_grace = 0;
}
/* drill state machine */
switch (player->drill_state) {
case DrillEmpty:
if (on_ground)
player->drill_state = DrillCharged;
break;
case DrillCharged:
if (kp_drill && (dir_x || dir_y)) {
player->drill_state = DrillPowered;
if (dir_x && dir_y) {
player->drill_x =
(float)dir_x * SQRT_0_5;
player->drill_y =
(float)dir_y * SQRT_0_5;
} else {
player->drill_x = dir_x;
player->drill_y = dir_y;
}
if (k_jump && player->jump_buffer &&
(player->jump_grace || player->jumps_left)) {
/* ground jump */
if (player->jump_grace) {
player->jump_grace = 0;
player->spd_y = JUMP_SPD;
}
break;
case DrillPowered:
if (kp_drill)
player->drill_state = DrillEmpty;
break;
default:
break;
/* air jump (burst) */
else {
player->jumps_left -= 1;
player->spd_y = AIR_JMP_SPD;
}
player->air_state = AirRising;
player->jump_buffer = 0;
}
/* speed reminder */