diff --git a/semestralka1/src/render/loop.cpp b/semestralka1/src/render/loop.cpp index 61d379f..de16ff6 100644 --- a/semestralka1/src/render/loop.cpp +++ b/semestralka1/src/render/loop.cpp @@ -10,14 +10,19 @@ extern BufferedSerial serial_port; extern DigitalOut led; -#define BUFFER_SIZE 64 +// Constants +constexpr size_t BUFFER_SIZE = 64; +constexpr auto CRAWL_DURATION = 300ms; +constexpr auto ANIMATION_TICK = 170ms; +constexpr auto MESSAGE_DISPLAY_DURATION = 1s; +constexpr int PLAYER_X = 18; +constexpr int PLAYER_Y = 13; enum class PlayerState { Walk1, Walk2, Crawl1 }; struct WalkingState { PlayerState current_state = PlayerState::Walk1; Timer state_timer; - bool state_timer_active = false; }; static char rx_buffer[BUFFER_SIZE]; @@ -56,7 +61,7 @@ static int read_uart() { } // po jednu sekundu sa sprava zobrazi - if (message_active && msg_timer.elapsed_time() > 1s) { + if (message_active && msg_timer.elapsed_time() > MESSAGE_DISPLAY_DURATION) { message_active = false; memset(message, 0, sizeof(message)); msg_timer.reset(); @@ -71,7 +76,7 @@ static int read_uart() { } static bool update_animation(Timer &anim_timer, int &shift, int speed) { - if (anim_timer.elapsed_time() >= 170ms) { + if (anim_timer.elapsed_time() >= ANIMATION_TICK) { // speed determines scroll steps per tick shift += speed; anim_timer.reset(); @@ -94,14 +99,11 @@ static int get_player_frame(PlayerState state) { } static void update_player_state(WalkingState &state) { - const auto CRAWL_DURATION = 300ms; - // stop crawling - if (state.current_state == PlayerState::Crawl1 && state.state_timer_active && + if (state.current_state == PlayerState::Crawl1 && state.state_timer.elapsed_time() >= CRAWL_DURATION) { state.current_state = PlayerState::Walk1; state.state_timer.stop(); - state.state_timer_active = false; } } @@ -113,6 +115,12 @@ static void toggle_walk_frame(WalkingState &state) { } } +static void start_crawl(WalkingState &state) { + state.current_state = PlayerState::Crawl1; + state.state_timer.reset(); + state.state_timer.start(); +} + void render_loop(int speed) { WalkingState player_state; @@ -127,28 +135,27 @@ void render_loop(int speed) { need_redraw = false; int uart_state = read_uart(); // returns 0/1/2 - if (uart_state == 1) + if (uart_state == 1) { need_redraw = true; + } if (uart_state == 2) { // start crawl frame for x time - player_state.current_state = PlayerState::Crawl1; - player_state.state_timer.reset(); - player_state.state_timer.start(); - player_state.state_timer_active = true; + start_crawl(player_state); need_redraw = true; } // Check if crawl duration expired update_player_state(player_state); - if (update_animation(anim_timer, shift, speed)) + if (update_animation(anim_timer, shift, speed)) { need_redraw = true; + } if (need_redraw) { draw_mask(bg_file, shift, message_active ? message : nullptr); int player_frame = get_player_frame(player_state.current_state); - draw_player(18, 13, player_frame); + draw_player(PLAYER_X, PLAYER_Y, player_frame); // alternate between frame 0 and 1 when not crawling if (player_state.current_state != PlayerState::Crawl1) {