diff --git a/semestralka1/src/game/state.cpp b/semestralka1/src/game/state.cpp index 912edb3..3a75832 100644 --- a/semestralka1/src/game/state.cpp +++ b/semestralka1/src/game/state.cpp @@ -1,5 +1,6 @@ // src/game/state.cpp #include "state.h" +#include #include "../render/player.h" #include "../timing/speed_controller.h" @@ -19,8 +20,14 @@ void WalkingState::start_crawl() { } // TODO THIS NEEDS REDESIGN ACCORDING TO SPEED -void WalkingState::toggle_walk_frame(int step) { - run_index = (run_index + step) % 7; +void WalkingState::toggle_walk_frame(float player_speed, int tick_counter) { + constexpr int FRAME_COUNT = 8; + float phase_speed = player_speed * 0.1f; // tune this scaling for animation tempo + + float phase = fmodf(tick_counter * phase_speed, 1.0f); + int frame = static_cast((1.0f - fabsf(sinf(phase * M_PI))) * (FRAME_COUNT - 1)); + + run_index = frame; } // void RunningState::toggle_run_frame() { // if (++run_index >= 7) run_index = 0; diff --git a/semestralka1/src/game/state.h b/semestralka1/src/game/state.h index bb4cd24..0e21aa6 100644 --- a/semestralka1/src/game/state.h +++ b/semestralka1/src/game/state.h @@ -23,7 +23,7 @@ private: public: void update(); void start_crawl(); - void toggle_walk_frame(int step); + void toggle_walk_frame(float player_speed, int tick_counter); FrameSelection get_frame_selection() const; PlayerState get_state() const { return current_state; } diff --git a/semestralka1/src/main.cpp b/semestralka1/src/main.cpp index 119483d..eab7434 100644 --- a/semestralka1/src/main.cpp +++ b/semestralka1/src/main.cpp @@ -22,5 +22,5 @@ int main(void) { printf("Baud: %d, Format: 8-N-1\r\n", BAUD_RATE); // Just call into render feature - render_loop(1); + render_loop(6); } diff --git a/semestralka1/src/render/loop.cpp b/semestralka1/src/render/loop.cpp index 3d51c26..84b3bd3 100644 --- a/semestralka1/src/render/loop.cpp +++ b/semestralka1/src/render/loop.cpp @@ -33,7 +33,7 @@ void render_loop(int speed) { bool need_redraw = false; int tick_counter = 0; - int player_speed = 3; + int player_speed = 4; while (true) { tick_counter++; @@ -66,9 +66,7 @@ void render_loop(int speed) { if (player_state.get_state() != PlayerState::Crawl) { - int step = timing.frame_advance_for(player_speed, tick_counter); - if (step > 0) - player_state.toggle_walk_frame(step); + player_state.toggle_walk_frame(player_speed, tick_counter); } ThisThread::sleep_for(50ms);