From 69765e686473bbd920221eda728b2cb83a6e516d Mon Sep 17 00:00:00 2001 From: Dominik Kaiser Date: Fri, 10 May 2024 15:53:31 +0200 Subject: Add tilemap.c and read map size --- include/so_long.h | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) (limited to 'include/so_long.h') diff --git a/include/so_long.h b/include/so_long.h index d66e355..ce481ef 100644 --- a/include/so_long.h +++ b/include/so_long.h @@ -6,16 +6,28 @@ /* By: dkaiser grid_size.x < 0 || tilemap->grid_size.y < 0) return (1); + fd = open(filename, O_RDONLY); + if (fd < 0) + return (1); + if (load_tiles_from_file(tilemap, fd)) + { + close(fd); + return (1); + } + close(fd); return (0); } @@ -56,6 +67,44 @@ static t_ivector get_map_size_from_file(int fd) return (result); } +static int load_tiles_from_file(t_tilemap *tilemap, int fd) +{ + int l; + char *next_line; + + tilemap->tiles = malloc(tilemap->grid_size.x * tilemap->grid_size.y + * sizeof(char)); + if (!tilemap->tiles) + return (1); + l = 0; + next_line = get_next_line(fd); + while (next_line) + { + if (load_tiles_from_line(tilemap, l, next_line)) + return (1); + next_line = get_next_line(fd); + l++; + } + return (0); +} + +static int load_tiles_from_line(t_tilemap *tilemap, int l, char *line) +{ + int x; + + x = 0; + while (line[x] && line[x] != '\n') + { + if (line[x] == EMPTY || line[x] == WALL || line[x] == COLLECTIBLE + || line[x] == PLAYER_START || line[x] == EXIT) + tilemap->tiles[l * tilemap->grid_size.x + x] = line[x]; + else + return (1); + line++; + } + return (0); +} + static int get_line_len(char *line) { int len; -- cgit v1.2.3 From f199b13df1350aa864a9104616f0d9b82606b4ed Mon Sep 17 00:00:00 2001 From: Dominik Kaiser Date: Sat, 11 May 2024 16:26:51 +0200 Subject: Finish map input --- include/so_long.h | 2 ++ src/init.c | 28 +++++++++++++++------------- src/tilemap.c | 34 +++++++++++++++++++++++----------- 3 files changed, 40 insertions(+), 24 deletions(-) (limited to 'include/so_long.h') diff --git a/include/so_long.h b/include/so_long.h index 2333368..47443aa 100644 --- a/include/so_long.h +++ b/include/so_long.h @@ -63,6 +63,8 @@ typedef struct s_tilemap t_ivector grid_size; t_ivector tile_size; char *tiles; + t_ivector player_start_tile; + t_ivector exit_tile; } t_tilemap; typedef struct s_game diff --git a/src/init.c b/src/init.c index 3c15791..5277b5c 100644 --- a/src/init.c +++ b/src/init.c @@ -6,7 +6,7 @@ /* By: dkaiser mlx = mlx_init(1920, 1080, "so_long", false); // TODO: make size and title dynamic game->input_direction = ZERO; init_hooks(game); - init_player(&game->player, 960, 540); - // TODO: make player spawn point dynamic - texture = mlx_load_png("textures/player.png"); - game->player.img = mlx_texture_to_image(game->mlx, texture); - mlx_resize_image(game->player.img, 48, 48); - mlx_image_to_window(game->mlx, game->player.img, game->player.position.x, - game->player.position.y); + init_player(game); return (0); } @@ -40,10 +33,19 @@ static void init_hooks(t_game *game) mlx_key_hook(game->mlx, on_key_input, game); } -static void init_player(t_player *player, int x, int y) +static void init_player(t_game *game) { - player->position.x = x; - player->position.y = y; + mlx_texture_t *texture; + t_player *player; + + player = &game->player; + texture = mlx_load_png("textures/player.png"); + player->position.x = game->map.player_start_tile.x * 48; + player->position.y = game->map.player_start_tile.y * 48; player->velocity.x = 0; player->velocity.y = 0; + player->img = mlx_texture_to_image(game->mlx, texture); + mlx_resize_image(player->img, 48, 48); + mlx_image_to_window(game->mlx, player->img, player->position.x, + player->position.y); } diff --git a/src/tilemap.c b/src/tilemap.c index 45d9fa5..ef830c7 100644 --- a/src/tilemap.c +++ b/src/tilemap.c @@ -6,11 +6,12 @@ /* By: dkaiser tiles[l * tilemap->grid_size.x + x] = line[x]; - else + if (line[pos.x] != '0' && line[pos.x] != '1' && line[pos.x] != 'C' + && line[pos.x] != 'P' && line[pos.x] != 'E') return (1); - line++; + if (line[pos.x] == PLAYER_START && !found_player_start) + { + tilemap->player_start_tile = pos; + found_player_start = 1; + } + else if (line[pos.x] == EXIT && !found_exit) + { + tilemap->exit_tile = pos; + found_exit = 1; + } + tilemap->tiles[l * tilemap->grid_size.x + pos.x] = line[pos.x]; + pos.x++; } return (0); } -- cgit v1.2.3 From e597be4f58e7252333192cb1e4211d74522b6102 Mon Sep 17 00:00:00 2001 From: Dominik Kaiser Date: Sat, 11 May 2024 16:27:45 +0200 Subject: Add wall rendering --- include/so_long.h | 3 ++- src/draw.c | 30 +++++++++++++++++++++++++++++- src/main.c | 3 ++- textures/wall.png | Bin 0 -> 99 bytes 4 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 textures/wall.png (limited to 'include/so_long.h') diff --git a/include/so_long.h b/include/so_long.h index 47443aa..e9097d1 100644 --- a/include/so_long.h +++ b/include/so_long.h @@ -6,7 +6,7 @@ /* By: dkaiser mlx, wall_texture); + mlx_resize_image(wall_image, 48, 48); + game->map.tile_size.x = 48; + game->map.tile_size.y = 48; + x = 0; + while (x < game->map.grid_size.x) + { + y = 0; + while (y < game->map.grid_size.y) + { + if (game->map.tiles[y * game->map.grid_size.x + x] == WALL) + mlx_image_to_window(game->mlx, wall_image, x * game->map.tile_size.x, y * game->map.tile_size.y); + y++; + } + x++; + } + return (0); +} + int draw(t_game *game) { game->player.img->instances[0].x = game->player.position.x; diff --git a/src/main.c b/src/main.c index 53fb23d..f7352f4 100644 --- a/src/main.c +++ b/src/main.c @@ -6,7 +6,7 @@ /* By: dkaiser