-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmain.c
More file actions
123 lines (113 loc) · 2.65 KB
/
main.c
File metadata and controls
123 lines (113 loc) · 2.65 KB
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include "cub3d.h"
void terminate(void *param)
{
int i;
t_cub *cub;
i = 0;
cub = (t_cub *)param;
clear_textures(cub);
while (cub->sprites_ready == true && i < 13)
{
if (cub->sprites.textures[i])
mlx_delete_texture(cub->sprites.textures[i]);
i++;
}
if (cub->mlx_window && cub->sprites.img)
mlx_delete_image(cub->mlx_window, cub->sprites.img);
if (cub->mlx_window && cub->mlx_img)
mlx_delete_image(cub->mlx_window, cub->mlx_img);
if (cub->mlx_window)
mlx_terminate(cub->mlx_window);
gc_free(cub);
free_trash(cub->garbage);
close(cub->map_fd);
exit(0);
}
void keyhook(mlx_key_data_t key, void *param)
{
t_cub *cub;
static int doors_opened;
cub = (t_cub *)param;
if (key.action == MLX_PRESS && key.key == MLX_KEY_O && !doors_opened)
{
change_map(cub, '2', '3');
doors_opened = 1;
}
else if (key.action == MLX_PRESS && key.key == MLX_KEY_O
&& doors_opened && cub->map[(long)(cub->player->y / TILESIZE)]
[(long)(cub->player->x / TILESIZE)] != '3')
{
change_map(cub, '3', '2');
doors_opened = 0;
}
if (key.action == MLX_PRESS && key.key == MLX_KEY_ESCAPE)
terminate(cub);
}
void terminate_on_error(t_cub *cub)
{
size_t i;
i = 0;
mlx_delete_texture(cub->ea_pic_data);
mlx_delete_texture(cub->we_pic_data);
mlx_delete_texture(cub->so_pic_data);
mlx_delete_texture(cub->no_pic_data);
mlx_delete_texture(cub->door_pic_data);
while (i < 13)
{
mlx_delete_texture(cub->sprites.textures[i]);
i++;
}
gc_free(cub);
free_trash(cub->garbage);
}
int render(t_cub *cub)
{
cub->mlx_window = mlx_init(WIN_WIDTH, W_HEIGHT, "cub3d", true);
if (!cub->mlx_window)
return (terminate_on_error(cub), -1);
cub->mlx_img = mlx_new_image(cub->mlx_window,
WIN_WIDTH, W_HEIGHT);
if (!cub->mlx_img)
{
mlx_terminate(cub->mlx_window);
return (terminate_on_error(cub), -1);
}
if (mlx_image_to_window(cub->mlx_window,
cub->mlx_img, 0, 0) < 0)
{
mlx_delete_image(cub->mlx_window, NULL);
mlx_terminate(cub->mlx_window);
return (terminate_on_error(cub), -1);
}
mlx_get_mouse_pos(cub->mlx_window, &cub->x_mouse, &cub->y_mouse);
put_frame(cub);
sprite(cub, 1, 0);
mlx_loop_hook(cub->mlx_window, my_keyhook, cub);
mlx_key_hook(cub->mlx_window, keyhook, cub);
mlx_close_hook(cub->mlx_window, terminate, cub);
mlx_loop(cub->mlx_window);
return (0);
}
int main(int ac, char **av)
{
t_cub cub;
if (ac != 2)
{
ft_putstr_fd("Error: Usage: cub3D <MAP.cub>\n", 2);
return (EXIT_FAILURE);
}
if (map_check(&cub, av[1]) == -1)
{
close(cub.map_fd);
gc_free(&cub);
free_trash(cub.garbage);
return (EXIT_FAILURE);
}
if (render(&cub) == -1)
{
close(cub.map_fd);
return (EXIT_FAILURE);
}
close(cub.map_fd);
return (EXIT_SUCCESS);
}