From 8bf1957e1e5f2c74e77e8e2d92b1f3c377b31d40 Mon Sep 17 00:00:00 2001 From: En Yi Date: Thu, 26 Sep 2024 21:31:24 +0800 Subject: [PATCH] Fix incorrect velocity reflection on collision --- scenes/game_systems.c | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/scenes/game_systems.c b/scenes/game_systems.c index 3544e77..48c2974 100644 --- a/scenes/game_systems.c +++ b/scenes/game_systems.c @@ -822,25 +822,30 @@ void tile_collision_system(Scene_t* scene) ); } } - - } } - if ( - ((collide_side & (1<<3)) && (p_ctransform->velocity.x < 0)) - || ((collide_side & (1<<2)) && (p_ctransform->velocity.x > 0)) - ) + + // Check X first + if ((collide_side & (1<<2)) || (collide_side & (1<<3))) { - p_ctransform->velocity.x *= -p_ctransform->bounce_coeff; + Vector2 check_pos = p_ent->position; + check_pos.x += p_ctransform->velocity.x * scene->delta_time; + if (check_collision_at(p_ent, check_pos, p_bbox->size, &tilemap)) + { + p_ctransform->velocity.x *= -p_ctransform->bounce_coeff; + } } - if ( - ((collide_side & (1<<1)) && (p_ctransform->velocity.y < 0)) - || ((collide_side & (1)) && (p_ctransform->velocity.y > 0)) - ) + // Check Y next + if ((collide_side & (1<<1)) || (collide_side & (1))) { - p_ctransform->velocity.y *= -p_ctransform->bounce_coeff; + Vector2 check_pos = p_ent->position; + check_pos.y += p_ctransform->velocity.y * scene->delta_time; + if (check_collision_at(p_ent, check_pos, p_bbox->size, &tilemap)) + { + p_ctransform->velocity.y *= -p_ctransform->bounce_coeff; + } } float decimal;