/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* 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) { int i; mlx_destroy_image(data->mlx, data->imgs.ply); mlx_destroy_image(data->mlx, data->imgs.bg); mlx_destroy_image(data->mlx, data->imgs.wall); mlx_destroy_image(data->mlx, data->imgs.col); mlx_destroy_image(data->mlx, data->imgs.exit); mlx_destroy_image(data->mlx, data->imgs.ene); 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); i = 0; while (data->map[i]) free(data->map[i++]); free(data->map); free(data->mlx); 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); } void *assets(t_data *data, char c) { if (c == '0' || c == 'P') return (data->imgs.bg); else if (c == '1') return (data->imgs.wall); else if (c == 'C') return (data->imgs.col); else if (c == 'E') return (data->imgs.exit); 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) mlx_put_image_to_window(data->mlx, data->mlx_win, data->imgs.ply, 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') mlx_put_image_to_window(data->mlx, data->mlx_win, data->imgs.bg, (data->w_screen / 2) + ((x - data->x_player) * data->size), (data->h_screen / 2) + ((y - data->y_player) * data->size)); else mlx_put_image_to_window(data->mlx, data->mlx_win, assets(data, data->map[y][x]), (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); data->imgs.ply = mlx_xpm_file_to_image(data->mlx, "assets/player.xpm", &data->size, &data->size); data->imgs.bg = mlx_xpm_file_to_image(data->mlx, "assets/background.xpm", &data->size, &data->size); data->imgs.wall = mlx_xpm_file_to_image(data->mlx, "assets/wall.xpm", &data->size, &data->size); data->imgs.col = mlx_xpm_file_to_image(data->mlx, "assets/collectible.xpm", &data->size, &data->size); data->imgs.exit = mlx_xpm_file_to_image(data->mlx, "assets/exit.xpm", &data->size, &data->size); data->imgs.ene = mlx_xpm_file_to_image(data->mlx, "assets/enemy.xpm", &data->size, &data->size); } 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_free(map, tmp_map, 1); else if (tmp_map) map = ft_strdup(tmp_map); free(tmp_map); i++; } 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); }