Compare commits
3 Commits
v1.4.0
...
09454e3ab4
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
09454e3ab4 | ||
|
|
07e295f2d9 | ||
|
|
42ad5ee7a2 |
@@ -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]);
|
||||||
|
|||||||
@@ -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): ping‑pong with holds at both ends
|
// 1) Normal (speed <= 6): ping‑pong with holds at both ends
|
||||||
// 2) High‑speed (speed >= 7): 0, random(1..last-1), last, random(1..last-1)...
|
// 2) High‑speed (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;
|
||||||
|
|||||||
@@ -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 0‑6
|
int walk_index = 0; // cycles 0‑6
|
||||||
int run_index = 0; // cycles 0‑6
|
int run_index = 0; // cycles 0‑6
|
||||||
int crawl_index = 0; // cycles 0‑1
|
int crawl1_index = 0; // cycles 0‑1
|
||||||
|
int crawl2_index = 0; // cycles 0‑1
|
||||||
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);
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user