so_long/so_long.c

240 lines
5.5 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* so_long.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: erey-bet <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 <stdio.h>
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);
}