diff --git a/semestralka1/src/game/state.cpp b/semestralka1/src/game/state.cpp index 3a75832..788bfe3 100644 --- a/semestralka1/src/game/state.cpp +++ b/semestralka1/src/game/state.cpp @@ -1,8 +1,21 @@ // src/game/state.cpp #include "state.h" -#include #include "../render/player.h" #include "../timing/speed_controller.h" +#include "../assets/character_run_frames.h" +#include "../assets/character_walk_frames.h" +#include "../assets/character_crawl_frames.h" +#include + +namespace { +int compute_frame_index(int frame_count, float player_speed, int tick_counter) { + float phase_speed = player_speed * 0.1f; + float phase = fmodf(tick_counter * phase_speed, 1.0f); + int frame = + static_cast((1.0f - fabsf(sinf(phase * M_PI))) * (frame_count - 1)); + return frame; +} +} // namespace void WalkingState::update() { // stop crawling after duration @@ -19,22 +32,44 @@ void WalkingState::start_crawl() { state_timer.start(); } -// TODO THIS NEEDS REDESIGN ACCORDING TO SPEED -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; +// switch walk/run based on relative speed +void WalkingState::set_motion_state_for_speed(int player_speed, + int ground_speed) { + int relative = player_speed - ground_speed; + if (relative > 1) + current_state = PlayerState::Run; + else + current_state = PlayerState::Walk; +} + +// TODO THIS NEEDS REDESIGN FOR WALK/RUN +void WalkingState::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); + break; + + case PlayerState::Walk: + walk_index = compute_frame_index(CHARACTER_WALK_FRAME_COUNT, player_speed, + tick_counter); + break; + + case PlayerState::Crawl: + crawl_index = compute_frame_index(CHARACTER_CRAWL_FRAME_COUNT, player_speed, + tick_counter); + break; + } + + case PlayerState::Crawl2: + crawl_index = compute_frame_index(CHARACTER_CRAWL2_FRAME_COUNT, player_speed, + tick_counter); + break; + } } -// void RunningState::toggle_run_frame() { -// if (++run_index >= 7) run_index = 0; -// } FrameSelection WalkingState::get_frame_selection() const { - FrameSelection f{MovementType::Walk, 0}; + FrameSelection f{MovementType::Walk, 0}; switch (current_state) { case PlayerState::Walk: diff --git a/semestralka1/src/game/state.h b/semestralka1/src/game/state.h index 0e21aa6..c5dcb66 100644 --- a/semestralka1/src/game/state.h +++ b/semestralka1/src/game/state.h @@ -14,7 +14,7 @@ struct FrameSelection { class WalkingState { private: - PlayerState current_state = PlayerState::Run; + PlayerState current_state = PlayerState::Walk; Timer state_timer; int walk_index = 0; // cycles 0‑6 int run_index = 0; // cycles 0‑6 @@ -23,6 +23,9 @@ private: public: void update(); void start_crawl(); + + void set_motion_state_for_speed(int player_speed, int ground_speed); + void toggle_walk_frame(float player_speed, int tick_counter); FrameSelection get_frame_selection() const; diff --git a/semestralka1/src/render/loop.cpp b/semestralka1/src/render/loop.cpp index 0ff2ad8..951be48 100644 --- a/semestralka1/src/render/loop.cpp +++ b/semestralka1/src/render/loop.cpp @@ -73,6 +73,7 @@ void render_loop(int speed) { if (player_state.get_state() != PlayerState::Crawl) { + player_state.set_motion_state_for_speed(player_speed, timing.get_ground_speed()); player_state.toggle_walk_frame(player_speed, tick_counter); }