From 968eb3d96c03e88919f12c7340c2b453d16b209f Mon Sep 17 00:00:00 2001 From: KikooDX Date: Fri, 2 Apr 2021 01:09:23 +0200 Subject: [PATCH] Drill base With state machine! --- CMakeLists.txt | 1 + assets/graphics/drill.png | Bin 0 -> 804 bytes assets/graphics/fxconv-metadata.txt | 3 +++ include/player.h | 7 ++++++ src/player/draw.c | 5 ++++ src/player/init.c | 4 ++++ src/player/update.c | 36 +++++++++++++++++++++++++++- 7 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 assets/graphics/drill.png diff --git a/CMakeLists.txt b/CMakeLists.txt index 58bc661..b2e05c1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,6 +23,7 @@ set(SOURCES set(ASSETS assets/graphics/tileset.png assets/graphics/player.png + assets/graphics/drill.png ) set(FLAGS diff --git a/assets/graphics/drill.png b/assets/graphics/drill.png new file mode 100644 index 0000000000000000000000000000000000000000..bf5de3f5615be2c431b9737a4486bc9249f4ac1f GIT binary patch literal 804 zcmV+<1Ka$GP)?t9TX99$WX#?7rnaIb&URkYBRvsOFY9Y?hwxtr?(tS@E-9H zE6D}o6XF=B0}|f~UGex$aM9y0!915;1pK0>RBU6Vjai8s#FNBPL$9#rdBjb^s=2aE zd6d=|Y-Eu_5)u?tun8Rw;*?FAS!Z9O;aftPJdFMps^H`(qD0;psTJy~Qr1XU>C;ga zbN@e2TbrKpx`&fM&#UWxjsu~6pk8y`-&5DEp82 z_#?ebs)o{MD(z?S5Eu`n9QKaY8^E9th8KI$s-yk=N-=*;!U)VTRs0)HR z!992dV>E3-Tmcb%%`E?I1VN}LKKKI9paV*QC*D%K0Rs>R4FNM=Xqce5#kgfoDd5|$ zh%FOOf(rft<7+Vln_dY02^DOcxD8>Brk%XqAoal``KJVeJ*+5ymI+`RO_>EY&Su-L zIji-j(i)Q&LnnexAUsf9CD*eAgbt>Ge;PYsB5kvFBj;C}dZtX?db8;*l2?gS$TkP* zUO#n@Wu2nnpD<$r$ZxEH4=-z^;p|a8P=+v-O}5-w;?HbimvSy0xq?lxTg%zqj$r>V i%}0DDUE=A`o&5`-`igN8X2{L}0000 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); } diff --git a/src/player/init.c b/src/player/init.c index 86fecac..a50bd21 100644 --- a/src/player/init.c +++ b/src/player/init.c @@ -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 */ diff --git a/src/player/update.c b/src/player/update.c index 94cebb5..a20b551 100644 --- a/src/player/update.c +++ b/src/player/update.c @@ -6,6 +6,8 @@ #include "tiles.h" #include +#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;