mirror of https://git.sr.ht/~kikoodx/momento
parent
a296033f51
commit
968eb3d96c
|
@ -23,6 +23,7 @@ set(SOURCES
|
|||
set(ASSETS
|
||||
assets/graphics/tileset.png
|
||||
assets/graphics/player.png
|
||||
assets/graphics/drill.png
|
||||
)
|
||||
|
||||
set(FLAGS
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 804 B |
|
@ -4,3 +4,6 @@ tileset.png:
|
|||
player.png:
|
||||
type: bopti-image
|
||||
name: bimg_player
|
||||
drill.png:
|
||||
type: bopti-image
|
||||
name: bimg_drill
|
||||
|
|
|
@ -10,6 +10,8 @@
|
|||
enum AirState { AirRising, AirBreaking, AirNeutral };
|
||||
#define AIR_BREAKING_FACTOR 3
|
||||
|
||||
enum DrillState { DrillCharged, DrillPowered, DrillEmpty };
|
||||
|
||||
struct Player {
|
||||
int x;
|
||||
int y;
|
||||
|
@ -22,6 +24,11 @@ struct Player {
|
|||
int jump_buffer;
|
||||
int jump_grace;
|
||||
enum AirState air_state;
|
||||
/* drill */
|
||||
int k_drill_previous;
|
||||
float drill_x;
|
||||
float drill_y;
|
||||
enum DrillState drill_state;
|
||||
};
|
||||
|
||||
/* used for collisions */
|
||||
|
|
|
@ -5,8 +5,13 @@
|
|||
#include <gint/display.h>
|
||||
|
||||
extern bopti_image_t bimg_player;
|
||||
extern bopti_image_t bimg_drill;
|
||||
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -21,6 +21,10 @@ struct Player player_init(void)
|
|||
.jump_buffer = 0,
|
||||
.jump_grace = 0,
|
||||
.air_state = AirNeutral,
|
||||
.k_drill_previous = 0,
|
||||
.drill_x = 0,
|
||||
.drill_y = 0,
|
||||
.drill_state = DrillEmpty,
|
||||
};
|
||||
|
||||
/* find spawn position in level */
|
||||
|
|
|
@ -6,6 +6,8 @@
|
|||
#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 */
|
||||
|
@ -17,10 +19,13 @@ 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);
|
||||
|
@ -79,6 +84,35 @@ int player_update(struct Player *player)
|
|||
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;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case DrillPowered:
|
||||
if (kp_drill)
|
||||
player->drill_state = DrillEmpty;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
/* speed reminder */
|
||||
const float spd_n_rem_x = player->spd_x + player->rem_x;
|
||||
const int spd_x = (int)spd_n_rem_x;
|
||||
|
|
Loading…
Reference in New Issue