movement class
This commit is contained in:
@@ -91,27 +91,28 @@ static inline int compute_frame_index(int frame_count,
|
||||
}
|
||||
} // namespace
|
||||
|
||||
void WalkingState::update() {
|
||||
void MovementState::update() {
|
||||
// stop crawling after duration
|
||||
if ((current_state == PlayerState::Crawl1 ||
|
||||
current_state == PlayerState::Crawl2) &&
|
||||
state_timer.elapsed_time() >= CRAWL_DURATION) {
|
||||
current_state = PlayerState::Walk;
|
||||
current_state = previous_state;
|
||||
state_timer.stop();
|
||||
}
|
||||
}
|
||||
|
||||
void WalkingState::start_crawl(PlayerState crawl_type) {
|
||||
void MovementState::start_crawl(PlayerState crawl_type) {
|
||||
if (crawl_type != PlayerState::Crawl1 && crawl_type != PlayerState::Crawl2)
|
||||
return;
|
||||
|
||||
previous_state = current_state;
|
||||
current_state = crawl_type;
|
||||
state_timer.stop();
|
||||
state_timer.reset();
|
||||
state_timer.start();
|
||||
}
|
||||
|
||||
void WalkingState::set_state(PlayerState s) {
|
||||
void MovementState::set_state(PlayerState s) {
|
||||
if (current_state != s) {
|
||||
walk_index = run_index = crawl1_index = crawl2_index = 0;
|
||||
phase = 0.0f;
|
||||
@@ -119,7 +120,7 @@ void WalkingState::set_state(PlayerState s) {
|
||||
current_state = s;
|
||||
}
|
||||
|
||||
void WalkingState::set_motion_state_for_speed(int player_speed, int ground_speed) {
|
||||
void MovementState::set_motion_state_for_speed(int player_speed, int ground_speed) {
|
||||
int relative = player_speed - ground_speed;
|
||||
PlayerState new_state = (relative > 1) ? PlayerState::Run : PlayerState::Walk;
|
||||
if (new_state != current_state) {
|
||||
@@ -130,7 +131,7 @@ void WalkingState::set_motion_state_for_speed(int player_speed, int ground_speed
|
||||
}
|
||||
|
||||
// TODO THIS NEEDS REDESIGN FOR WALK/RUN
|
||||
void WalkingState::toggle_walk_frame(float player_speed, int tick_counter) {
|
||||
void MovementState::toggle_walk_frame(float player_speed, int tick_counter) {
|
||||
switch (current_state) {
|
||||
case PlayerState::Run:
|
||||
run_index = compute_frame_index(CHARACTER_RUN_FRAME_COUNT, player_speed, tick_counter);
|
||||
@@ -150,7 +151,7 @@ void WalkingState::toggle_walk_frame(float player_speed, int tick_counter) {
|
||||
}
|
||||
}
|
||||
|
||||
FrameSelection WalkingState::get_frame_selection() const {
|
||||
FrameSelection MovementState::get_frame_selection() const {
|
||||
FrameSelection f{};
|
||||
switch (current_state) {
|
||||
case PlayerState::Walk:
|
||||
|
||||
@@ -12,9 +12,10 @@ struct FrameSelection {
|
||||
int frame_index;
|
||||
};
|
||||
|
||||
class WalkingState {
|
||||
class MovementState {
|
||||
private:
|
||||
PlayerState current_state = PlayerState::Walk;
|
||||
PlayerState previous_state = PlayerState::Walk;
|
||||
Timer state_timer;
|
||||
int walk_index = 0; // cycles 0‑6
|
||||
int run_index = 0; // cycles 0‑6
|
||||
|
||||
@@ -26,7 +26,7 @@ constexpr int PLAYER_Y = 6;
|
||||
void draw_mask(const char *unused_filename, int shift, const char *text);
|
||||
|
||||
void render_loop(int speed) {
|
||||
WalkingState player_state;
|
||||
MovementState player_state;
|
||||
AnimationController animation;
|
||||
UartReader uart(serial_port);
|
||||
MovementController mover(PLAYER_X, VIEW_WIDTH);
|
||||
@@ -114,21 +114,20 @@ void render_loop(int speed) {
|
||||
CharacterPosition draw_pos = get_aligned_frame_position(pos, frame.movement, frame.frame_index);
|
||||
draw_character(draw_pos.x, draw_pos.y, frame.movement, frame.frame_index);
|
||||
|
||||
for (int i = 0; i < MAX_OBSTACLES; i++) {
|
||||
if (!obstacle_pool[i].active)
|
||||
continue;
|
||||
// for (int i = 0; i < MAX_OBSTACLES; i++) {
|
||||
// if (!obstacle_pool[i].active)
|
||||
// continue;
|
||||
|
||||
draw_obstacle(obstacle_pool[i].data.x,
|
||||
obstacle_pool[i].data.y,
|
||||
obstacle_pool[i].type);
|
||||
// draw_obstacle(obstacle_pool[i].data.x, obstacle_pool[i].data.y,
|
||||
// obstacle_pool[i].type);
|
||||
|
||||
if (check_collision(pos, frame.movement, obstacle_pool[i].data)) {
|
||||
printf("\033[2J\033[H");
|
||||
printf("GAME OVER\r\n");
|
||||
game_over = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
// if (check_collision(pos, frame.movement, obstacle_pool[i].data)) {
|
||||
// printf("\033[2J\033[H");
|
||||
// printf("GAME OVER\r\n");
|
||||
// game_over = true;
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
|
||||
if (game_over)
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user