/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* so_long.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: erey-bet +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/12/09 14:18:18 by erey-bet #+# #+# */ /* Updated: 2022/12/14 17:15:45 by erey-bet ### ########.fr */ /* */ /* ************************************************************************** */ #include "so_long.h" #include void all_free(t_data *data) { (void)data; } int quit(t_data *data) { mlx_destroy_image(data->mlx, data->mlx_img); mlx_clear_window(data->mlx, data->mlx_win); mlx_destroy_window(data->mlx, data->mlx_win); mlx_destroy_display(data->mlx); mlx_loop_end(data->mlx); free(data->mlx); //free(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); } char get_element(t_data *data, t_xy xy) { return (data->map[xy.y][xy.x]); } 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' || c == 'P') 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(t_data *data) { int x; int y; int range; range = 3; x = data->x_player - range; while (x < data->x_player + range) { while (x < -1) x++; y = data->y_player - range; while (y < data->y_player + range) { while (y < -1) y++; if (x == data->x_player && y == data->y_player) { 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->w_screen / 2, data->h_screen / 2); } else if (y < 0 || x < 0 || y >= data->h_map || data->map[y][x] == '\n' || data->map[y][x] == '\0') { data->mlx_img = mlx_xpm_file_to_image(data->mlx, "assets/background.xpm", &data->size, &data->size); mlx_put_image_to_window(data->mlx, data->mlx_win, data->mlx_img, (data->w_screen / 2) + ((x - data->x_player) * data->size), (data->h_screen / 2) + ((y - data->y_player) * data->size)); } else { 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, (data->w_screen / 2) + ((x - data->x_player) * data->size), (data->h_screen / 2) + ((y - data->y_player) * data->size)); } y++; } x++; } } int render(t_data *data) { if (data->update == 1) { //mlx_clear_window(data->mlx, data->mlx_win); draw(data); 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->mlx = mlx_init(); mlx_get_screen_size(data->mlx, &data->w_screen, &data->h_screen); } void get_map(char *argv[], t_data *data) { char *tmp_map; //char *tmp_map2; 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) { if (tmp_map) free(tmp_map); tmp_map = get_next_line(fd); if (tmp_map && map) { map = ft_strjoin_free(map, tmp_map, 1); } else if (tmp_map) map = ft_strdup(tmp_map); i++; } if (tmp_map) free(tmp_map); data->map = ft_split(map, '\n'); data->h_map = i - 1; free(map); } 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); }