-
Notifications
You must be signed in to change notification settings - Fork 0
/
ray_hit_wall.c
105 lines (99 loc) · 3.32 KB
/
ray_hit_wall.c
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* ray_hit_wall.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: fflores <[email protected]> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/11/02 17:49:31 by fflores #+# #+# */
/* Updated: 2020/11/02 17:49:33 by fflores ### ########.fr */
/* */
/* ************************************************************************** */
#include "cub3d.h"
void ray_pointer(t_ray *ray)
{
ray->point_down = (ray->angel >= 0 && ray->angel < M_PI) ? 1 : 0;
ray->point_up = !ray->point_down;
ray->point_left =
(ray->angel >= M_PI / 2 && ray->angel < 3 * M_PI / 2) ? 1 : 0;
ray->point_right = !ray->point_left;
}
static void ray_v_config(t_data *data, t_ray *ray)
{
ray->f_v_w_h = 0;
ray->dx = (int)(data->player.x / TILE_SIZE) * TILE_SIZE;
ray->dx += (ray->point_right) ? TILE_SIZE : 0;
ray->dy =
data->player.y + (ray->dx - data->player.x) * tan(ray->angel);
ray->x_step = TILE_SIZE;
ray->x_step *= (ray->point_left) ? -1 : 1;
ray->y_step = TILE_SIZE * tan(ray->angel);
ray->y_step *= (ray->point_up && ray->y_step > 0) ? -1 : 1;
ray->y_step *= (ray->point_down && ray->y_step < 0) ? -1 : 1;
ray->next_vert_x = ray->dx;
ray->next_vert_y = ray->dy;
ray->v_w_h_x = 0;
ray->v_w_h_y = 0;
}
static void ray_h_config(t_data *data, t_ray *ray)
{
ray->f_h_w_h = 0;
ray->dy = (int)(data->player.y / TILE_SIZE) * TILE_SIZE;
ray->dy += (ray->point_down) ? TILE_SIZE : 0;
ray->dx = data->player.x + (ray->dy - data->player.y) / tan(ray->angel);
ray->y_step = TILE_SIZE;
ray->y_step *= (ray->point_up) ? -1 : 1;
ray->x_step = TILE_SIZE / tan(ray->angel);
ray->x_step *= (ray->point_right && ray->x_step < 0) ? -1 : 1;
ray->x_step *= (ray->point_left && ray->x_step > 0) ? -1 : 1;
ray->next_horz_x = ray->dx;
ray->next_horz_y = ray->dy;
ray->h_w_h_x = 0;
ray->h_w_h_y = 0;
}
void ray_vert_hit_wall(t_ray *ray, t_data *data)
{
ray_v_config(data, ray);
while (ray->f_v_w_h == 0)
{
if (ray->next_vert_y > 0 && is_wall(data,
ray->next_vert_x - (ray->point_left ? 1 : 0), ray->next_vert_y) == 1)
{
ray->v_w_h_x = ray->next_vert_x;
ray->v_w_h_y = ray->next_vert_y;
ray->f_v_w_h = 1;
break ;
}
else if (is_wall(data,
ray->next_vert_x - (ray->point_left ? 1 : 0), ray->next_vert_y) == -1)
break ;
else
{
ray->next_vert_x += ray->x_step;
ray->next_vert_y += ray->y_step;
}
}
}
void ray_horz_hit_wall(t_ray *ray, t_data *data)
{
ray_h_config(data, ray);
while (ray->f_h_w_h == 0)
{
if (is_wall(data,
ray->next_horz_x, ray->next_horz_y - (ray->point_up ? 1 : 0)) == 1)
{
ray->h_w_h_x = ray->next_horz_x;
ray->h_w_h_y = ray->next_horz_y;
ray->f_h_w_h = 1;
break ;
}
else if (is_wall(data,
ray->next_horz_x, ray->next_horz_y - (ray->point_up ? 1 : 0)) == -1)
break ;
else
{
ray->next_horz_x += ray->x_step;
ray->next_horz_y += ray->y_step;
}
}
}