42_cub3d/src/move_utils.c

73 lines
2.4 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* move_utils.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: mcolonna <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/11/13 21:42:57 by mcolonna #+# #+# */
/* Updated: 2024/11/13 21:46:49 by mcolonna ### ########.fr */
/* */
/* ************************************************************************** */
#include "move_utils.h"
#include "utils.h"
#include "map.h"
#include "global.h"
#include "const.h"
static void move_in_direction(t_point_double *pos, t_direction dir,
double value)
{
if (dir == NORTH)
pos->y -= value;
else if (dir == SOUTH)
pos->y += value;
else if (dir == EAST)
pos->x -= value;
else if (dir == WEST)
pos->x += value;
}
static void push_from_wall(int cx, int cy)
{
const t_point_double p = g_map.player.pos;
double distance_with_side[4];
t_direction d;
t_direction d_min;
const t_point_double c_d = {cx, cy};
if (map_get_case(&g_map, cx, cy)->wall == EMPTY)
return ;
if (p.x > c_d.x - HITBOX && p.x < c_d.x + 1 + HITBOX
&& p.y > c_d.y - HITBOX && p.y < c_d.y + 1 + HITBOX)
{
distance_with_side[NORTH] = p.y - (c_d.y - HITBOX);
distance_with_side[SOUTH] = (c_d.y + 1 + HITBOX) - p.y;
distance_with_side[EAST] = p.x - (c_d.x - HITBOX);
distance_with_side[WEST] = (c_d.x + 1 + HITBOX) - p.x;
d_min = 0;
d = 0;
while (++d < 4)
if (distance_with_side[d] < distance_with_side[d_min])
d_min = d;
move_in_direction(&g_map.player.pos, d_min, distance_with_side[d_min]);
}
}
void push_from_walls(void)
{
t_point_int p;
p.x = (int)g_map.player.pos.x;
p.y = (int)g_map.player.pos.y;
push_from_wall(p.x - 1, p.y);
push_from_wall(p.x + 1, p.y);
push_from_wall(p.x, p.y - 1);
push_from_wall(p.x, p.y + 1);
push_from_wall(p.x - 1, p.y - 1);
push_from_wall(p.x - 1, p.y + 1);
push_from_wall(p.x + 1, p.y - 1);
push_from_wall(p.x + 1, p.y + 1);
}