From c7fd02590a1d5b7113c77ee34359682c65fa93f2 Mon Sep 17 00:00:00 2001 From: Adam Joly Date: Mon, 7 Oct 2024 11:25:31 +0200 Subject: [PATCH] =?UTF-8?q?=E3=80=8C=F0=9F=8F=97=EF=B8=8F=E3=80=8D=20wip:?= =?UTF-8?q?=20DDA=20setup=20finished=20and=20loop=20started?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MacroLibX | 2 +- includes/game/constant.h | 18 ++++++ includes/game/dda.h | 26 +++++++++ includes/{ => game}/game.h | 44 +++------------ includes/game/settings.h | 32 +++++++++++ includes/game/typedef.h | 64 ++++++++++++++++++++++ src/cub3d.c | 4 +- src/raycasting/dda_while.c | 35 ++++++++++++ src/raycasting/get_player_image.c | 8 +-- src/raycasting/get_ray_angle.c | 10 ++-- src/raycasting/graphic_utils/draw_square.c | 4 +- src/raycasting/key_hook.c | 5 +- src/raycasting/print_map.c | 4 +- src/raycasting/setup_dda.c | 58 ++++++++++++++++++++ 14 files changed, 258 insertions(+), 56 deletions(-) create mode 100644 includes/game/constant.h create mode 100644 includes/game/dda.h rename includes/{ => game}/game.h (78%) create mode 100644 includes/game/settings.h create mode 100644 includes/game/typedef.h create mode 100644 src/raycasting/dda_while.c create mode 100644 src/raycasting/setup_dda.c diff --git a/MacroLibX b/MacroLibX index 3dd68f9..4d640ed 160000 --- a/MacroLibX +++ b/MacroLibX @@ -1 +1 @@ -Subproject commit 3dd68f994248bfa6e6c634ca9c838dfe48b53520 +Subproject commit 4d640ed70cd392f3e3311fe2779905876b7f1b6f diff --git a/includes/game/constant.h b/includes/game/constant.h new file mode 100644 index 0000000..25bf300 --- /dev/null +++ b/includes/game/constant.h @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* constant.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/04 16:39:48 by adjoly #+# #+# */ +/* Updated: 2024/10/04 16:40:10 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef CONSTANT_H +# define CONSTANT_H + +# define WHITE 0xFFFFFFFF + +#endif diff --git a/includes/game/dda.h b/includes/game/dda.h new file mode 100644 index 0000000..685e43f --- /dev/null +++ b/includes/game/dda.h @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* dda.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/04 14:04:10 by adjoly #+# #+# */ +/* Updated: 2024/10/06 18:48:38 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef DDA_H +# define DDA_H + +# include "typedef.h" + +/** + * @brief Function used to get all the ray angle + * + * @param player The address of the t_player struct + * @param dda The address of the t_dda struct + */ +void get_ray_angle(t_player *player, t_dda (*dda)[800]); + +#endif diff --git a/includes/game.h b/includes/game/game.h similarity index 78% rename from includes/game.h rename to includes/game/game.h index 02a5b4a..b2b71df 100644 --- a/includes/game.h +++ b/includes/game/game.h @@ -6,55 +6,24 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/11 16:38:40 by adjoly #+# #+# */ -/* Updated: 2024/09/29 16:47:32 by adjoly ### ########.fr */ +/* Updated: 2024/10/06 18:48:33 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ #ifndef GAME_H # define GAME_H +# include "dda.h" +# include "settings.h" # include "parsing.h" +# include "typedef.h" + # include +# include # include # include # include -# define ESCAPE_KEY 41 -# define W_KEY 26 -# define S_KEY 22 -# define A_KEY 4 -# define D_KEY 7 -# define WHITE 0xFFFFFFFF -# define WINDOW_Y 900 -# define WINDOW_X 1600 -# define PLAYER_ROT_SPEED (2 * M_PI) / 8 -# define PLAYER_SPEED 3 -# define MAP_CHUNK_SIZE 64 -# define RAY_SIZE 2 -# define FOV 60 * (M_PI / 180) - -typedef struct s_ray_dir -{ - float x; - float y; -} t_ray_dir; - -typedef struct s_player -{ - t_coord coords; - double direction; - t_ray_dir ray_dir[WINDOW_X / RAY_SIZE]; -} t_player; - -typedef struct s_cub -{ - void *mlx; - void *win; - void *sprites; - void *img; - char **map; - t_player player; -} t_cub; /** * @brief This function is used to handle keypress @@ -105,4 +74,5 @@ void draw_square(t_cub *cub, t_coord coord, uint16_t size, int color); * @param cub The address of the t_cub struct */ void print_map(t_cub *cub); + #endif diff --git a/includes/game/settings.h b/includes/game/settings.h new file mode 100644 index 0000000..13294b9 --- /dev/null +++ b/includes/game/settings.h @@ -0,0 +1,32 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* settings.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/04 14:06:39 by adjoly #+# #+# */ +/* Updated: 2024/10/04 16:38:10 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef SETTINGS_H +# define SETTINGS_H + +// Key code +# define ESCAPE_KEY 41 +# define W_KEY 26 +# define S_KEY 22 +# define A_KEY 4 +# define D_KEY 7 + +# define WHITE 0xFFFFFFFF +# define WINDOW_Y 900 +# define WINDOW_X 1600 +# define PLAYER_ROT_SPEED (2 * M_PI) / 8 +# define PLAYER_SPEED 3 +# define MAP_CHUNK_SIZE 64 +# define RAY_SIZE 2 +# define FOV 60 * (M_PI / 180) + +#endif diff --git a/includes/game/typedef.h b/includes/game/typedef.h new file mode 100644 index 0000000..b0e4435 --- /dev/null +++ b/includes/game/typedef.h @@ -0,0 +1,64 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* typedef.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/04 14:28:24 by adjoly #+# #+# */ +/* Updated: 2024/10/06 19:03:26 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef STRUCT_H +# define STRUCT_H + +# include "parsing.h" +# include + +typedef struct s_coord_f +{ + float x; + float y; +} t_coord_f; + +typedef struct s_step +{ + char x; + char y; +} t_step; + +typedef struct s_player +{ + t_coord coords; + double direction; +} t_player; + +typedef struct s_cub +{ + void *mlx; + void *win; + void *sprites; + void *img; + char **map; + t_player player; +} t_cub; + +typedef enum s_wall_side +{ + HORIZONTAL, + VERTICAL +} t_wall_side; + +typedef struct s_dda +{ + t_coord_f ray_dir; + t_coord_f side_dist; + t_coord_f delta_dist; + t_step step; + t_wall_side wall_side; + bool wall_hit; + +} t_dda; + +#endif diff --git a/src/cub3d.c b/src/cub3d.c index c61b2ad..185ba1c 100644 --- a/src/cub3d.c +++ b/src/cub3d.c @@ -6,12 +6,12 @@ /* By: madumerg +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/04 16:58:27 by madumerg #+# #+# */ -/* Updated: 2024/09/29 14:44:07 by adjoly ### ########.fr */ +/* Updated: 2024/10/06 17:58:41 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ #include "cub3d.h" -#include "game.h" +#include "game/game.h" #include "mlx.h" int main(int ac, char **av) diff --git a/src/raycasting/dda_while.c b/src/raycasting/dda_while.c new file mode 100644 index 0000000..f417fda --- /dev/null +++ b/src/raycasting/dda_while.c @@ -0,0 +1,35 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* dda_while.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/06 18:46:56 by adjoly #+# #+# */ +/* Updated: 2024/10/06 19:05:11 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "game/game.h" + +void dda_while(t_dda *dda, char **map, t_coord map_coord) +{ + dda->wall_hit = false; + while (!dda->wall_hit) + { + if (dda->side_dist.x < dda->side_dist.y) + { + dda->side_dist.x += dda->delta_dist.x; + map_coord.x += dda->step.x; + dda->wall_side = HORIZONTAL; + } + else + { + dda->side_dist.y += dda->delta_dist.y; + map_coord.y += dda->step.y; + dda->wall_side = VERTICAL; + } + if (map[map_coord.x][map_coord.y] == '1') + dda->wall_hit = true; + } +} diff --git a/src/raycasting/get_player_image.c b/src/raycasting/get_player_image.c index e20ffa7..2c0506b 100644 --- a/src/raycasting/get_player_image.c +++ b/src/raycasting/get_player_image.c @@ -6,13 +6,12 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/13 11:05:02 by adjoly #+# #+# */ -/* Updated: 2024/09/29 14:44:28 by adjoly ### ########.fr */ +/* Updated: 2024/10/05 14:30:08 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ -#include "game.h" -#include "mlx.h" -#include "stdio.h" +#include "game/game.h" +#include void change_direction(double speed, bool clockwise, t_player *player) { @@ -24,7 +23,6 @@ void change_direction(double speed, bool clockwise, t_player *player) player->direction -= 2 * M_PI; else if (player->direction < 0) player->direction += 2 * M_PI; - printf("%f\n", player->direction); } void get_player_image(t_cub *cub, uint8_t key_pressed) diff --git a/src/raycasting/get_ray_angle.c b/src/raycasting/get_ray_angle.c index 0a05f02..71d3626 100644 --- a/src/raycasting/get_ray_angle.c +++ b/src/raycasting/get_ray_angle.c @@ -6,13 +6,13 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/29 15:26:29 by adjoly #+# #+# */ -/* Updated: 2024/09/29 16:46:44 by adjoly ### ########.fr */ +/* Updated: 2024/10/06 17:58:04 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ -#include "game.h" +#include "game/game.h" -void get_ray_angle(t_player *player) +void get_ray_angle(t_player *player, t_dda (*dda)[800]) { uint16_t x; float ray_angle; @@ -21,8 +21,8 @@ void get_ray_angle(t_player *player) while (x < WINDOW_X) { ray_angle = player->direction - (FOV / 2) + (x / WINDOW_X) * FOV; - player->ray_angle[x / RAY_SIZE].x = cos(ray_angle); - player->ray_angle[x / RAY_SIZE].y = sin(ray_angle); + dda[x / RAY_SIZE]->ray_dir.x = cos(ray_angle); + dda[x / RAY_SIZE]->ray_dir.y = sin(ray_angle); x += RAY_SIZE; } } diff --git a/src/raycasting/graphic_utils/draw_square.c b/src/raycasting/graphic_utils/draw_square.c index b847ad0..3f82596 100644 --- a/src/raycasting/graphic_utils/draw_square.c +++ b/src/raycasting/graphic_utils/draw_square.c @@ -6,11 +6,11 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/17 11:09:52 by adjoly #+# #+# */ -/* Updated: 2024/09/23 14:05:54 by adjoly ### ########.fr */ +/* Updated: 2024/10/06 15:41:55 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ -#include "game.h" +#include "game/game.h" #include "mlx.h" void draw_square(t_cub *cub, t_coord coord, uint16_t size, int color) diff --git a/src/raycasting/key_hook.c b/src/raycasting/key_hook.c index c0db844..34ae44e 100644 --- a/src/raycasting/key_hook.c +++ b/src/raycasting/key_hook.c @@ -6,13 +6,14 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/11 16:37:56 by adjoly #+# #+# */ -/* Updated: 2024/09/29 14:45:02 by adjoly ### ########.fr */ +/* Updated: 2024/10/04 15:29:00 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ #include #include "mlx.h" -#include "game.h" +#include "parsing.h" +#include "game/game.h" int key_hook(int key, void *param) { diff --git a/src/raycasting/print_map.c b/src/raycasting/print_map.c index 9c8e56a..a129f79 100644 --- a/src/raycasting/print_map.c +++ b/src/raycasting/print_map.c @@ -6,11 +6,11 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/23 14:09:17 by adjoly #+# #+# */ -/* Updated: 2024/09/23 14:41:51 by adjoly ### ########.fr */ +/* Updated: 2024/10/06 17:58:25 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ -#include "game.h" +#include "game/game.h" #include "mlx.h" #include diff --git a/src/raycasting/setup_dda.c b/src/raycasting/setup_dda.c new file mode 100644 index 0000000..1801b12 --- /dev/null +++ b/src/raycasting/setup_dda.c @@ -0,0 +1,58 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* setup_dda.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/09/30 23:47:14 by adjoly #+# #+# */ +/* Updated: 2024/10/06 19:02:43 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "game/game.h" +#include +#include + +void get_side_dist(t_dda *dda, t_coord incell_coords, t_player *player) +{ + if (dda->ray_dir.x < 0) + { + dda->side_dist.x = incell_coords.x * dda->delta_dist.x; + dda->step.x = -MAP_CHUNK_SIZE; + } + else + { + dda->side_dist.x = (((int)player->coords.x + MAP_CHUNK_SIZE) - player->coords.x) * dda->delta_dist.x; + dda->step.x = MAP_CHUNK_SIZE; + } + if (dda->ray_dir.y < 0) + { + dda->side_dist.y = incell_coords.y * dda->delta_dist.y; + dda->step.y = -MAP_CHUNK_SIZE; + } + else + { + dda->side_dist.y = (((int)player->coords.y + MAP_CHUNK_SIZE) - player->coords.y) * dda->delta_dist.y; + dda->step.y = MAP_CHUNK_SIZE; + } +} + +void setup_dda(t_player *player) +{ + t_dda dda[WINDOW_X / RAY_SIZE]; + size_t i; + t_coord incell_coords; + + i = 0; + get_ray_angle(player, &dda); + incell_coords.x = player->coords.x % MAP_CHUNK_SIZE; + incell_coords.y = player->coords.y % MAP_CHUNK_SIZE; + while (i < WINDOW_X / RAY_SIZE) + { + dda[i].delta_dist.x = abs((int)(MAP_CHUNK_SIZE / dda[i].ray_dir.x)); + dda[i].delta_dist.y = abs((int)(MAP_CHUNK_SIZE / dda[i].ray_dir.y)); + get_side_dist(&dda[i], incell_coords, player); + i++; + } +}