3 Commits

Author SHA1 Message Date
Priec
09454e3ab4 crawl trigger bug fixed 2025-11-17 11:30:52 +01:00
Priec
07e295f2d9 crawl command fixed 2025-11-17 00:20:41 +01:00
Filipriec
42ad5ee7a2 crawl was redesigned to crwal1 and crawl2 2025-11-16 22:40:09 +01:00
7 changed files with 73 additions and 36 deletions

View File

@@ -1,8 +1,8 @@
// src/assets/character_crawl_frames.h // src/assets/character_crawl_frames.h
#pragma once #pragma once
// Crawl frame 1 // Crawl1 frame 1
static const char *CRAWL_FRAME_1[] = { static const char *CRAWL1_FRAME_1[] = {
"........", "........",
"........", "........",
"...y4@W.", "...y4@W.",
@@ -11,8 +11,8 @@ static const char *CRAWL_FRAME_1[] = {
".aa@s@.." ".aa@s@.."
}; };
// Crawl frame 2 // Crawl2 frame 1
static const char *CRAWL_FRAME_2[] = { static const char *CRAWL2_FRAME_1[] = {
"........", "........",
"........", "........",
"........", "........",
@@ -21,18 +21,22 @@ static const char *CRAWL_FRAME_2[] = {
".a@@PR@L" ".a@@PR@L"
}; };
enum class CrawlFrame { enum class CrawlType {
Crawl1 = 0, Crawl1 = 0,
Crawl2, Crawl2,
COUNT COUNT
}; };
static const char **CHARACTER_CRAWL_FRAMES[] = { static const char **CHARACTER_CRAWL1_FRAMES[] = {
CRAWL_FRAME_1, CRAWL1_FRAME_1,
CRAWL_FRAME_2 };
static const char **CHARACTER_CRAWL2_FRAMES[] = {
CRAWL2_FRAME_1,
}; };
static const int CHARACTER_CRAWL_FRAME_COUNT = sizeof(CHARACTER_CRAWL_FRAMES) / sizeof(CHARACTER_CRAWL_FRAMES[0]); static const int CHARACTER_CRAWL1_FRAME_COUNT = sizeof(CHARACTER_CRAWL1_FRAMES) / sizeof(CHARACTER_CRAWL1_FRAMES[0]);
static const int CHARACTER_CRAWL2_FRAME_COUNT = sizeof(CHARACTER_CRAWL2_FRAMES) / sizeof(CHARACTER_CRAWL2_FRAMES[0]);
// Height (rows per crawl frame) // Height (rows per crawl frame)
static const int CHARACTER_CRAWL_FRAME_HEIGHT = sizeof(CRAWL_FRAME_1) / sizeof(CRAWL_FRAME_1[0]); static const int CHARACTER_CRAWL1_FRAME_HEIGHT = sizeof(CRAWL1_FRAME_1) / sizeof(CRAWL1_FRAME_1[0]);
static const int CHARACTER_CRAWL2_FRAME_HEIGHT = sizeof(CRAWL2_FRAME_1) / sizeof(CRAWL2_FRAME_1[0]);

View File

@@ -8,6 +8,7 @@
#include <cmath> #include <cmath>
namespace { namespace {
// Vygenerovane AI, proste to nahodne vymiena obrazky - assests
// Frame selector with two regimes: // Frame selector with two regimes:
// 1) Normal (speed <= 6): pingpong with holds at both ends // 1) Normal (speed <= 6): pingpong with holds at both ends
// 2) Highspeed (speed >= 7): 0, random(1..last-1), last, random(1..last-1)... // 2) Highspeed (speed >= 7): 0, random(1..last-1), last, random(1..last-1)...
@@ -92,22 +93,27 @@ static inline int compute_frame_index(int frame_count,
void WalkingState::update() { void WalkingState::update() {
// stop crawling after duration // stop crawling after duration
if (current_state == PlayerState::Crawl && if ((current_state == PlayerState::Crawl1 ||
current_state == PlayerState::Crawl2) &&
state_timer.elapsed_time() >= CRAWL_DURATION) { state_timer.elapsed_time() >= CRAWL_DURATION) {
current_state = PlayerState::Walk; current_state = PlayerState::Walk;
state_timer.stop(); state_timer.stop();
} }
} }
void WalkingState::start_crawl() { void WalkingState::start_crawl(PlayerState crawl_type) {
current_state = PlayerState::Crawl; if (crawl_type != PlayerState::Crawl1 && crawl_type != PlayerState::Crawl2)
return;
current_state = crawl_type;
state_timer.stop();
state_timer.reset(); state_timer.reset();
state_timer.start(); state_timer.start();
} }
void WalkingState::set_state(PlayerState s) { void WalkingState::set_state(PlayerState s) {
if (current_state != s) { if (current_state != s) {
walk_index = run_index = crawl_index = 0; walk_index = run_index = crawl1_index = crawl2_index = 0;
phase = 0.0f; phase = 0.0f;
} }
current_state = s; current_state = s;
@@ -127,18 +133,19 @@ void WalkingState::set_motion_state_for_speed(int player_speed, int ground_speed
void WalkingState::toggle_walk_frame(float player_speed, int tick_counter) { void WalkingState::toggle_walk_frame(float player_speed, int tick_counter) {
switch (current_state) { switch (current_state) {
case PlayerState::Run: case PlayerState::Run:
run_index = run_index = compute_frame_index(CHARACTER_RUN_FRAME_COUNT, player_speed, tick_counter);
compute_frame_index(CHARACTER_RUN_FRAME_COUNT, player_speed, tick_counter);
break; break;
case PlayerState::Walk: case PlayerState::Walk:
walk_index = walk_index = compute_frame_index(CHARACTER_WALK_FRAME_COUNT, player_speed, tick_counter);
compute_frame_index(CHARACTER_WALK_FRAME_COUNT, player_speed, tick_counter);
break; break;
case PlayerState::Crawl: case PlayerState::Crawl1:
crawl_index = crawl1_index = compute_frame_index(CHARACTER_CRAWL1_FRAME_COUNT, player_speed, tick_counter);
compute_frame_index(CHARACTER_CRAWL_FRAME_COUNT, player_speed, tick_counter); break;
case PlayerState::Crawl2:
crawl2_index = compute_frame_index(CHARACTER_CRAWL2_FRAME_COUNT, player_speed, tick_counter);
break; break;
} }
} }
@@ -154,9 +161,13 @@ FrameSelection WalkingState::get_frame_selection() const {
f.movement = MovementType::Run; f.movement = MovementType::Run;
f.frame_index = run_index; f.frame_index = run_index;
break; break;
case PlayerState::Crawl: case PlayerState::Crawl1:
f.movement = MovementType::Crawl; f.movement = MovementType::Crawl1;
f.frame_index = crawl_index; f.frame_index = crawl1_index;
break;
case PlayerState::Crawl2:
f.movement = MovementType::Crawl2;
f.frame_index = crawl2_index;
break; break;
default: default:
f.movement = MovementType::Walk; f.movement = MovementType::Walk;

View File

@@ -5,7 +5,7 @@
constexpr auto CRAWL_DURATION = 300ms; constexpr auto CRAWL_DURATION = 300ms;
enum class PlayerState { Walk, Run, Crawl }; enum class PlayerState { Walk, Run, Crawl1, Crawl2 };
struct FrameSelection { struct FrameSelection {
MovementType movement; MovementType movement;
@@ -18,12 +18,13 @@ private:
Timer state_timer; Timer state_timer;
int walk_index = 0; // cycles 06 int walk_index = 0; // cycles 06
int run_index = 0; // cycles 06 int run_index = 0; // cycles 06
int crawl_index = 0; // cycles 01 int crawl1_index = 0; // cycles 01
int crawl2_index = 0; // cycles 01
float phase = 0.0f; float phase = 0.0f;
public: public:
void update(); void update();
void start_crawl(); void start_crawl(PlayerState crawl_type);
void set_motion_state_for_speed(int player_speed, int ground_speed); void set_motion_state_for_speed(int player_speed, int ground_speed);
void toggle_walk_frame(float player_speed, int tick_counter); void toggle_walk_frame(float player_speed, int tick_counter);

View File

@@ -54,8 +54,17 @@ void render_loop(int speed) {
} }
if (uart_event == UartEvent::Triggered) { if (uart_event == UartEvent::Triggered) {
// start crawl frame for x time PlayerState current = player_state.get_state();
player_state.start_crawl();
// pressing UART trigger while walking/running -> Crawl1
if (current == PlayerState::Walk || current == PlayerState::Run) {
player_state.start_crawl(PlayerState::Crawl1);
}
// pressing again while crawling -> Crawl2
else if (current == PlayerState::Crawl1) {
player_state.start_crawl(PlayerState::Crawl2);
}
need_redraw = true; need_redraw = true;
} }

View File

@@ -27,12 +27,20 @@ void draw_character(int x, int y, MovementType movement, int frame_index) {
character_height = CHARACTER_RUN_FRAME_HEIGHT; character_height = CHARACTER_RUN_FRAME_HEIGHT;
break; break;
case MovementType::Crawl: case MovementType::Crawl1:
total_frames = CHARACTER_CRAWL_FRAME_COUNT; total_frames = CHARACTER_CRAWL1_FRAME_COUNT;
if (frame_index < 0 || frame_index >= total_frames) if (frame_index < 0 || frame_index >= total_frames)
frame_index = 0; frame_index = 0;
character = CHARACTER_CRAWL_FRAMES[frame_index]; character = CHARACTER_CRAWL1_FRAMES[frame_index];
character_height = CHARACTER_CRAWL_FRAME_HEIGHT; character_height = CHARACTER_CRAWL1_FRAME_HEIGHT;
break;
case MovementType::Crawl2:
total_frames = CHARACTER_CRAWL2_FRAME_COUNT;
if (frame_index < 0 || frame_index >= total_frames)
frame_index = 0;
character = CHARACTER_CRAWL2_FRAMES[frame_index];
character_height = CHARACTER_CRAWL2_FRAME_HEIGHT;
break; break;
} }

View File

@@ -4,7 +4,8 @@
enum class MovementType { enum class MovementType {
Walk, Walk,
Run, Run,
Crawl Crawl1,
Crawl2
}; };
// Draw the player object starting at given (x, y) // Draw the player object starting at given (x, y)

View File

@@ -18,8 +18,11 @@ CharacterPosition get_aligned_frame_position(CharacterPosition base,
case MovementType::Run: case MovementType::Run:
character_height = CHARACTER_RUN_FRAME_HEIGHT; character_height = CHARACTER_RUN_FRAME_HEIGHT;
break; break;
case MovementType::Crawl: case MovementType::Crawl1:
character_height = CHARACTER_CRAWL_FRAME_HEIGHT; character_height = CHARACTER_CRAWL1_FRAME_HEIGHT;
break;
case MovementType::Crawl2:
character_height = CHARACTER_CRAWL2_FRAME_HEIGHT;
break; break;
} }