speed bug fixed now properly well

This commit is contained in:
Filipriec
2025-12-11 17:10:55 +01:00
parent 50f523b52d
commit 17c53ace99
5 changed files with 26 additions and 24 deletions

View File

@@ -23,6 +23,7 @@ struct GameState {
int background_shift; int background_shift;
int current_speed;
ObstacleRenderData obstacles[MAX_RENDER_OBSTACLES]; ObstacleRenderData obstacles[MAX_RENDER_OBSTACLES];
bool game_over; bool game_over;

View File

@@ -120,16 +120,6 @@ void MovementState::set_state(PlayerState s) {
current_state = s; current_state = s;
} }
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) {
run_index = 0;
walk_index = 0;
}
current_state = new_state;
}
void MovementState::toggle_walk_frame(float player_speed, int tick_counter) { void MovementState::toggle_walk_frame(float player_speed, int tick_counter) {
switch (current_state) { switch (current_state) {
case PlayerState::Run: case PlayerState::Run:

View File

@@ -27,7 +27,6 @@ public:
void update(); void update();
void start_crawl(PlayerState crawl_type); void start_crawl(PlayerState crawl_type);
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);
FrameSelection get_frame_selection() const; FrameSelection get_frame_selection() const;

View File

@@ -21,5 +21,5 @@ int main(void) {
serial_port.set_format(8, BufferedSerial::None, 1); serial_port.set_format(8, BufferedSerial::None, 1);
printf("Baud: %d, Format: 8-N-1\r\n", BAUD_RATE); printf("Baud: %d, Format: 8-N-1\r\n", BAUD_RATE);
render_loop(2); render_loop(1);
} }

View File

@@ -37,29 +37,39 @@ void logic_loop(void *arg) {
timing.set_ground_speed(speed); timing.set_ground_speed(speed);
CharacterPosition pos = {PLAYER_X, PLAYER_Y}; CharacterPosition pos = {PLAYER_X, PLAYER_Y};
if (speed < 3)
player_state.set_state(PlayerState::Run);
else
player_state.set_state(PlayerState::Walk);
Timer spawn_timer; Timer spawn_timer;
spawn_timer.start(); spawn_timer.start();
Timer speed_timer;
speed_timer.start();
int anim_tick_counter = 0; int anim_tick_counter = 0;
int tick_counter = 0; int tick_counter = 0;
bool game_over = false; bool game_over = false;
// Spawn first obstacle // Spawn first obstacle
if (speed >= 5)
spawn_obstacle(CrawlObstacleType::Crawl1, VIEW_WIDTH + 10); spawn_obstacle(CrawlObstacleType::Crawl1, VIEW_WIDTH + 10);
while (!game_over) { while (!game_over) {
tick_counter++; tick_counter++;
if (speed_timer.elapsed_time() >= 6s) {
speed++;
timing.set_ground_speed(speed);
speed_timer.reset();
// update player's animation mode
if (speed < 4)
player_state.set_state(PlayerState::Walk);
else
player_state.set_state(PlayerState::Run);
}
mover.update_position(speed, timing.get_ground_speed()); mover.update_position(speed, timing.get_ground_speed());
pos.x = mover.get_position(); pos.x = mover.get_position();
// Spawn periodically // Spawn periodically
if (spawn_timer.elapsed_time() > 5s) { if (speed >= 5 && spawn_timer.elapsed_time() > 6s) {
spawn_timer.reset(); spawn_timer.reset();
spawn_obstacle(CrawlObstacleType::Crawl1, VIEW_WIDTH); spawn_obstacle(CrawlObstacleType::Crawl1, VIEW_WIDTH);
} }
@@ -90,8 +100,7 @@ void logic_loop(void *arg) {
player_state.toggle_walk_frame(speed, anim_tick_counter); player_state.toggle_walk_frame(speed, anim_tick_counter);
FrameSelection frame = player_state.get_frame_selection(); FrameSelection frame = player_state.get_frame_selection();
CharacterPosition draw_pos = CharacterPosition draw_pos = get_aligned_frame_position(pos, frame.movement, frame.frame_index);
get_aligned_frame_position(pos, frame.movement, frame.frame_index);
// check collision // check collision
bool collision = false; bool collision = false;
@@ -106,6 +115,7 @@ void logic_loop(void *arg) {
g_state_mutex.lock(); g_state_mutex.lock();
g_state.player_pos = draw_pos; g_state.player_pos = draw_pos;
g_state.current_speed = speed;
g_state.movement = frame.movement; g_state.movement = frame.movement;
g_state.frame_index = frame.frame_index; g_state.frame_index = frame.frame_index;
g_state.background_shift = animation.get_shift(); g_state.background_shift = animation.get_shift();
@@ -153,12 +163,14 @@ void render_loop_thread() {
draw_mask("background", local.background_shift); draw_mask("background", local.background_shift);
draw_character(local.player_pos.x, local.player_pos.y, local.movement, draw_character(local.player_pos.x, local.player_pos.y, local.movement,
local.frame_index); local.frame_index);
if (local.current_speed >= 5) {
for (int i = 0; i < MAX_RENDER_OBSTACLES; i++) { for (int i = 0; i < MAX_RENDER_OBSTACLES; i++) {
if (local.obstacles[i].active) if (local.obstacles[i].active)
draw_obstacle(local.obstacles[i].x, local.obstacles[i].y, draw_obstacle(local.obstacles[i].x, local.obstacles[i].y,
local.obstacles[i].type); local.obstacles[i].type);
} }
} }
}
ThisThread::sleep_for(50ms); ThisThread::sleep_for(50ms);
} }