Drill base

With state machine!
This commit is contained in:
KikooDX 2021-04-02 01:09:23 +02:00
parent a296033f51
commit 968eb3d96c
7 changed files with 55 additions and 1 deletions

View File

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

BIN
assets/graphics/drill.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 804 B

View File

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

View File

@ -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 */

View File

@ -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);
}

View File

@ -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 */

View File

@ -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;