From ef93ab8638e4b2526bfbbea9788cd884fc362bbb Mon Sep 17 00:00:00 2001 From: Dominik Kaiser Date: Wed, 15 May 2024 15:09:01 +0200 Subject: [PATCH] Change collision function input to t_collider --- include/so_long.h | 15 +++++--- src/collision.c | 81 +++++++++++++++++++++----------------------- src/player_process.c | 10 +++--- 3 files changed, 55 insertions(+), 51 deletions(-) diff --git a/include/so_long.h b/include/so_long.h index 4118166..585527e 100644 --- a/include/so_long.h +++ b/include/so_long.h @@ -6,7 +6,7 @@ /* By: dkaiser b_pos.x - && a_pos.y < b_size.y + b_pos.y && a_pos.y + a_size.y > b_pos.y) + if (a.position.x < b.size.x + b.position.x && a.position.x + + a.size.x > b.position.x && a.position.y < b.size.y + b.position.y + && a.position.y + a.size.y > b.position.y) { - if (a_pos.x < b_pos.x) + if (a.position.x < b.position.x) result |= RIGHT; - if (a_pos.x > b_pos.x) + if (a.position.x > b.position.x) result |= LEFT; - if (a_pos.y < b_pos.y) + if (a.position.y < b.position.y) result |= DOWN; - if (a_pos.y > b_pos.y) + if (a.position.y > b.position.y) result |= UP; } return (result); } -int check_wall_collision(t_vector a_pos, t_ivector a_size, t_tilemap *map) +int check_wall_collision(t_collider collider, t_tilemap *map) { int result; - t_ivector a_tile; + t_ivector local_tile; t_ivector check_tile; int x; int y; - result = 0; - a_tile = screen_to_grid_pos(a_pos, map->tile_size); + result = 0; + local_tile = screen_to_grid_pos(collider.position, map->tile_size); x = -1; while (x <= 1) { y = -1; while (y <= 1) { - check_tile.x = a_tile.x + x; - check_tile.y = a_tile.y + y; - result |= check_wall_collision_with_cell(a_pos, a_size, map, - check_tile); + check_tile.x = local_tile.x + x; + check_tile.y = local_tile.y + y; + result |= check_wall_collision_with_cell(collider, map, check_tile); y++; } x++; @@ -68,46 +67,44 @@ int check_wall_collision(t_vector a_pos, t_ivector a_size, t_tilemap *map) return (result); } -static int check_wall_collision_with_cell(t_vector a_pos, t_ivector a_size, - t_tilemap *map, t_ivector tile) +static int check_wall_collision_with_cell(t_collider collider, t_tilemap *map, + t_ivector tile) { - t_vector wall_pos; - t_ivector wall_size; + t_collider wall; if (get_tile(map, tile.x, tile.y) == WALL) { - wall_pos = grid_to_screen_pos(tile, map->tile_size); - wall_size.x = map->tile_size.x; - wall_size.y = map->tile_size.y; - return (check_collision(a_pos, a_size, wall_pos, wall_size)); + wall.position = grid_to_screen_pos(tile, map->tile_size); + wall.size.x = map->tile_size.x; + wall.size.y = map->tile_size.y; + return (check_collision(collider, wall)); } return (0); } -void move_and_slide(t_actor *actor, t_tilemap *map, double delta_time) +void move_and_slide(t_actor *actor, t_tilemap *map, double delta_time) { - t_vector move_pos; - - move_pos.x = actor->position.x + (actor->velocity.x * delta_time); - move_pos.y = actor->position.y; + t_collider c; - if ((check_wall_collision(move_pos, actor->size, map) & (RIGHT | LEFT)) == 0) - actor->position.x = move_pos.x; + c.size = actor->size; + c.position.x = actor->position.x + (actor->velocity.x * delta_time); + c.position.y = actor->position.y; + if ((check_wall_collision(c, map) & (RIGHT | LEFT)) == 0) + actor->position.x = c.position.x; else actor->velocity.x = 0; - - move_pos.x = actor->position.x; - move_pos.y = actor->position.y + (actor->velocity.y * delta_time); - if ((check_wall_collision(move_pos, actor->size, map) & (UP | DOWN)) == 0) - actor->position.y = move_pos.y; + c.position.x = actor->position.x; + c.position.y = actor->position.y + (actor->velocity.y * delta_time); + if ((check_wall_collision(c, map) & (UP | DOWN)) == 0) + actor->position.y = c.position.y; else actor->velocity.y = 0; } -int is_on_floor(t_vector pos, t_ivector size, t_tilemap *map) +int is_on_floor(t_collider collider, t_tilemap *map) { - pos.y += 5; - if (check_wall_collision(pos, size, map)) + collider.position.y += 5; + if (check_wall_collision(collider, map)) return (1); return (0); } diff --git a/src/player_process.c b/src/player_process.c index c66d13d..0194d59 100644 --- a/src/player_process.c +++ b/src/player_process.c @@ -6,7 +6,7 @@ /* By: dkaiser player; player->direction = get_direction_from_input(game); player->velocity.x = player->direction.x * PLAYER_MOVE_SPEED; player->velocity.y += 50; - if (player->direction.y == -1 && is_on_floor(player->position, player->size, - &game->map)) + c.position = player->position; + c.size = player->size; + if (player->direction.y == -1 && is_on_floor(c, &game->map)) player->velocity.y = -1000; move_and_slide(player, &game->map, game->mlx->delta_time); } -- 2.47.2