/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* so_long.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: erey-bet +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/12/09 14:18:18 by erey-bet #+# #+# */ /* Updated: 2022/12/12 21:52:42 by erey-bet ### ########.fr */ /* */ /* ************************************************************************** */ #include "so_long.h" #include void free_img(t_data *data) { mlx_destroy_image(data->mlx, data->mlx_img); free(data->mlx_img); } int quit(t_data *data) { (void)data; exit(0); return (0); } t_xy *get_position(t_data *data, char c) { int y; t_xy *xy; y = 0; xy = NULL; while (data->map[y]) { if (ft_strchr_gnl(data->map[y], c) != -1) { xy = ft_calloc(1, sizeof(t_xy)); xy->x = ft_strchr_gnl(data->map[y], c); xy->y = y; break; } y++; } return (xy); } int get_new_element(t_data *data, int x, int y) { return(data->map[data->y_player + y][data->x_player + x]); } void set_new_element(t_data *data, int x, int y) { data->map[data->y_player + y][data->x_player + x] = '0'; } int end(t_data *data) { if (get_position(data, 'C') == NULL) quit(data); return (1); } void set_position_player(t_data *data, t_xy *xy) { data->x_player = xy->x; data->y_player = xy->y; free(xy); } void move(t_data *data, int x, int y) { if (get_new_element(data, x, y) == '1') return ; if (get_new_element(data, x, y) == 'C') set_new_element(data, x, y); if (get_new_element(data, x, y) == 'E') if (end(data)) return ; data->x_player += x; data->y_player += y; } int key_hook(int key, t_data *data) { if (key == K_ESC) quit(data); else if (key == K_LEFT) move(data, -1, 0); else if (key == K_RIGHT) move(data, 1, 0); else if (key == K_UP) move(data, 0, -1); else if (key == K_DOWN) move(data, 0, 1); data->update = 1; return (0); } char *assets(char c) { if (c == '0') return ("assets/background.xpm"); else if (c == '1') return ("assets/wall.xpm"); else if (c == 'C') return ("assets/collectible.xpm"); else if (c == 'E') return ("assets/exit.xpm"); return (NULL); } void draw_map(t_data *data) { int x; int y; x = 0; while (x < (data->w_screen / data->size)) { y = 0; while (y < (data->h_screen / data->size)) { if (x != data->x_player || y != data->y_player) { data->mlx_img = mlx_xpm_file_to_image(data->mlx, assets(data->map[y][x]), &data->size, &data->size); if (!data->mlx_img) data->mlx_img = mlx_xpm_file_to_image(data->mlx, assets('0'), &data->size, &data->size); mlx_put_image_to_window(data->mlx, data->mlx_win, data->mlx_img, x * data->size, y * data->size); } y++; } x++; } } int render(t_data *data) { if (data->update == 1) { draw_map(data); data->mlx_img = mlx_xpm_file_to_image(data->mlx, "assets/player.xpm", &data->size, &data->size); mlx_put_image_to_window(data->mlx, data->mlx_win, data->mlx_img, data->x_player * data->size, data->y_player * data->size); data->update = 0; } return (0); } void init_data(t_data *data) { data->update = 1; data->size = 128; data->x_player = 0; data->y_player = 0; data->h_screen = 768; data->w_screen = 768; data->mlx = mlx_init(); } void get_map(char *argv[], t_data *data) { char *tmp_map; char *map; int i; int fd; fd = open(argv[1], O_RDONLY); if (fd == -1) return ; i = 0; map = NULL; tmp_map = NULL; while (i == 0 || tmp_map != NULL) { tmp_map = get_next_line(fd); if (tmp_map && map) map = ft_strjoin(map, tmp_map); else if (tmp_map) map = tmp_map; i++; } data->map = ft_split(map, '\n'); data->h_screen = (i - 1) * data->size; data->w_screen = ft_strlen(*data->map) * data->size; } int main(int argc, char *argv[]) { t_data data; (void)argc; (void)argv; init_data(&data); get_map(argv, &data); if (data.map == NULL) return (1); set_position_player(&data, get_position(&data, 'P')); data.mlx_win = mlx_new_window(data.mlx, data.w_screen, data.h_screen, "lili meli"); mlx_hook(data.mlx_win, 17, 0, quit, &data); mlx_key_hook(data.mlx_win, key_hook, &data); mlx_loop_hook(data.mlx, render, &data); mlx_loop(data.mlx); return (0); }