https://i.imgur.com/N4PpsAz.gifv
To make it clear I purely don't understand what should be doing. Everything I try to look up on 2D collisions just tell me how to check if 2 boxes intersect and never go further. I am trying to fully understand this problem but there appear to be a lack of information on the actual problem and more people just telling each other to use box2d -_-
Here is a snippet of how it works
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | if (player_moved) { dv2 ent_rect_pos = { entity->position.x + entity->collision.position.x, entity->position.y + entity->collision.position.y }; dv2 player_collision_pos = { new_player_position.x + local_player->collision.position.x, new_player_position.y + local_player->collision.position.y }; f64 left_check = MAX(ent_rect_pos.x, player_collision_pos.x); f64 top_check = MAX(ent_rect_pos.y, player_collision_pos.y); f64 right_check = MIN(ent_rect_pos.x + entity->collision.dimentions.w, player_collision_pos.x + local_player->collision.dimentions.w); f64 bottom_check = MIN(ent_rect_pos.y + entity->collision.dimentions.h, player_collision_pos.y + local_player->collision.dimentions.h); f64 col_result_x = left_check - right_check; f64 col_result_y = top_check - bottom_check; b32 collided = left_check <= right_check && top_check <= bottom_check; if (collided) { dv2 final_position = new_player_position; if (abs(col_result_x) > abs(col_result_y)) { if (player_moved_up) { final_position.y = ent_rect_pos.y - local_player->collision.dimentions.h - local_player->collision.position.y; } if (player_moved_down) { final_position.y = ent_rect_pos.y + local_player->collision.dimentions.h - local_player->collision.position.y; } } else { if (player_moved_left) { final_position.x = ent_rect_pos.x + entity->collision.dimentions.w; } if (player_moved_right) { final_position.x = ent_rect_pos.x - local_player->collision.dimentions.w; } } new_player_position = final_position; } } |