mirror of https://git.sr.ht/~kikoodx/momento
parent
968eb3d96c
commit
ae1fbb12b5
|
@ -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
|
||||
|
|
Before Width: | Height: | Size: 804 B After Width: | Height: | Size: 804 B |
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue