240 lines
5.5 KiB
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);
|
|
}
|