diff --git a/headers/cube3d_macro.h b/headers/cube3d_macro.h index 9efe213..1f4d472 100644 --- a/headers/cube3d_macro.h +++ b/headers/cube3d_macro.h @@ -1,13 +1,27 @@ #ifndef CUBE3D_MACRO_H # define CUBE3D_MACRO_H +/* + * game params + */ + +/* nbr pixel player move */ +# define PLR_MV 1 +/* nbr key you can press at the same time */ # define MAX_NB_KEY 3 -# define SCREEN_DIST 50 -# define SCREEN_SIZE 100 -# define SCREEN_DEF 50 -# define PLR_MV 5 +/* screen width */ +# define SCREEN_WIDTH 500 +/* screen height */ +# define SCREEN_HEIGHT 200 +/* screen focal (in degree) */ +# define SCREEN_FOCAL 90 +/* size of a cell on the map */ # define CELL 20 +/* + * keys macro + */ + # define ARROW_LEFT 65361 # define ARROW_UP 65362 # define ARROW_RIGHT 65363 diff --git a/headers/cube3d_struct.h b/headers/cube3d_struct.h index a0b8e49..3ebeffb 100644 --- a/headers/cube3d_struct.h +++ b/headers/cube3d_struct.h @@ -35,6 +35,8 @@ typedef struct s_rcast t_vec screen_dist; t_vec screen_size; t_vec ray; + int screen_def; + int cell; int cell_x; int cell_y; int slope_x; @@ -84,6 +86,7 @@ typedef struct s_map char **content; int size_x; int size_y; + int cell; } t_map; /* @@ -110,18 +113,18 @@ typedef struct s_plr typedef struct s_game { void *mlx_ptr; - // map window - t_win map_win; - t_img map_img; // game window -// t_win win; -// t_img img; + t_win win; + t_img img; // player t_plr plr; // rays t_rcast rcast; // map t_map map; + // map window + t_win map_win; + t_img map_img; // key hook int k_hook[MAX_NB_KEY]; } t_game; diff --git a/srcs/cube3d.c b/srcs/cube3d.c index f343b41..4890f0d 100644 --- a/srcs/cube3d.c +++ b/srcs/cube3d.c @@ -11,8 +11,9 @@ void destroy_mlx(void *param) mlx_destroy_window(game->mlx_ptr, game->map_win.ptr); // tmp end -// mlx_destroy_image(game->mlx_ptr, game->img.ptr); -// mlx_destroy_window(game->mlx_ptr, game->win.ptr); + mlx_destroy_image(game->mlx_ptr, game->img.ptr); + mlx_destroy_window(game->mlx_ptr, game->win.ptr); + mlx_destroy_display(game->mlx_ptr); } @@ -33,17 +34,6 @@ int main(int ac, char **av) // draw game a first time before it start draw(game); - // tmp, to draw map - // receive a keypress event - mlx_hook(game->map_win.ptr, 2, 1L << 0, keypress, game); - // receive a keyprelease event - mlx_hook(game->map_win.ptr, 3, 1L << 1, keyrelease, game); - // receive event when clicking the red button to close the window - mlx_hook(game->map_win.ptr, 17, 1L << 17, shut_down, NULL); - // infinite loop that waits for events to occurs - // tmp end - -/* // receive a keypress event mlx_hook(game->win.ptr, 2, 1L << 0, keypress, game); // receive a keyprelease event @@ -51,9 +41,8 @@ int main(int ac, char **av) // receive event when clicking the red button to close the window mlx_hook(game->win.ptr, 17, 1L << 17, shut_down, NULL); // infinite loop that waits for events to occurs -*/ -// mlx_loop_hook(game->mlx_ptr, hook_action, game); + mlx_loop_hook(game->mlx_ptr, hook_action, game); mlx_loop(game->mlx_ptr); return (0); } diff --git a/srcs/draw/draw.c b/srcs/draw/draw.c index 4d0a486..62f4e72 100644 --- a/srcs/draw/draw.c +++ b/srcs/draw/draw.c @@ -75,7 +75,9 @@ void draw_line(t_game *game, t_vec vec, int color) { t_coord incr; t_coord pos; + int cell; + cell = game->map.cell; incr.x = 0; pos.x = 0; pos.y = 0; @@ -85,19 +87,19 @@ void draw_line(t_game *game, t_vec vec, int color) while ((game->map.content)[incr.x][incr.y]) { if ((game->map.content)[incr.x][incr.y] == '1' ) - draw_square(game, pos, 0x00999999, 0x00000000, CELL, 0); + draw_square(game, pos, 0x00999999, 0x00000000, cell, 0); else - draw_square(game, pos, 0x00555555, 0x00333333, CELL, 0); + draw_square(game, pos, 0x00555555, 0x00333333, cell, 0); (incr.y)++; - pos.x += CELL; + pos.x += cell; } (incr.x)++; pos.x = 0; - pos.y += CELL; + pos.y += cell; } - pos.x = game->plr.pos.x - CELL / 2; - pos.y = game->plr.pos.y - CELL / 2; - draw_square(game, pos, 0x00999900, 0x00330033, CELL, 1); + pos.x = game->plr.pos.x - cell / 2; + pos.y = game->plr.pos.y - cell / 2; + draw_square(game, pos, 0x00999900, 0x00330033, cell, 1); } static void draw_screen(t_game *game, t_rcast *rcast) @@ -132,7 +134,7 @@ void draw(t_game *game) // tmp, to draw map draw_screen(game, &(game->rcast)); - mlx_put_image_to_window(game->mlx_ptr, game->map_win.ptr, game->map_img.ptr, 0, 0); + mlx_put_image_to_window(game->mlx_ptr, game->map_win.ptr, game->map_img.ptr, 0, SCREEN_HEIGHT); // tmp end // mlx_put_image_to_window(game->mlx_ptr, game->win.ptr, game->img.ptr, 0, 0); diff --git a/srcs/draw/ray_intersect.c b/srcs/draw/ray_intersect.c index 6eeaa9a..decb5a5 100644 --- a/srcs/draw/ray_intersect.c +++ b/srcs/draw/ray_intersect.c @@ -12,8 +12,8 @@ static void init_raycast(t_rcast *rcast, t_vec *ray) if (ray->start.y < ray->end.y) rcast->ray_sign_y = -1; // cell position of ray - rcast->cell_x = ray->start.x / CELL; - rcast->cell_y = ray->start.y / CELL; + rcast->cell_x = ray->start.x / rcast->cell; + rcast->cell_y = ray->start.y / rcast->cell; // slope of ray rcast->slope_x = ray->end.x - ray->start.x; rcast->slope_y = ray->end.y - ray->start.y; @@ -21,23 +21,22 @@ static void init_raycast(t_rcast *rcast, t_vec *ray) rcast->next_cell_x = -rcast->ray_sign_x; rcast->next_cell_y = -rcast->ray_sign_y; // ray steps in both axis - rcast->ray_step_x = ft_abs(CELL * rcast->slope_y); - rcast->ray_step_y = ft_abs(CELL * rcast->slope_x); + rcast->ray_step_x = ft_abs(rcast->cell * rcast->slope_y); + rcast->ray_step_y = ft_abs(rcast->cell * rcast->slope_x); } static void init_first_step(t_rcast *rcast, t_vec *ray) { - // first next time ray cross grid - rcast->first_next_x = ray->start.x % CELL; + rcast->first_next_x = ray->start.x % rcast->cell; if (rcast->first_next_x && rcast->ray_sign_x < 0) - rcast->first_next_x = CELL - rcast->first_next_x; + rcast->first_next_x = rcast->cell - rcast->first_next_x; if (!rcast->first_next_x && rcast->ray_sign_x < 0) - rcast->first_next_x = CELL; - rcast->first_next_y = ray->start.y % CELL; + rcast->first_next_x = rcast->cell; + rcast->first_next_y = ray->start.y % rcast->cell; if (rcast->first_next_y && rcast->ray_sign_y < 0) - rcast->first_next_y = CELL - rcast->first_next_y; + rcast->first_next_y = rcast->cell - rcast->first_next_y; if (!rcast->first_next_y && rcast->ray_sign_y < 0) - rcast->first_next_y = CELL; + rcast->first_next_y = rcast->cell; rcast->next_x = ft_abs(rcast->first_next_x * rcast->slope_y); rcast->next_y = ft_abs(rcast->first_next_y * rcast->slope_x); } @@ -58,45 +57,16 @@ static void next_cell(t_rcast *rcast) } } -static void calcul_ray_end(t_rcast *rcast, t_vec *ray) -{ - if (rcast->is_x) - { - ray->end.x = rcast->cell_x * CELL; - if (rcast->ray_sign_x == 1) - ray->end.x += CELL; - if (rcast->slope_x) - { - rcast->ratio = (double)(ray->end.x - ray->start.x) / (double)rcast->slope_x; - ray->end.y = ray->start.y + (double)rcast->slope_y * rcast->ratio; - } - } - else - { - ray->end.y = rcast->cell_y * CELL; - if (rcast->ray_sign_y == 1) - ray->end.y += CELL; - if (rcast->slope_y) - { - rcast->ratio = (double)(ray->end.y - ray->start.y) / (double)rcast->slope_y; - ray->end.x = ray->start.x + (double)rcast->slope_x * rcast->ratio; - } - } -} - void ray_intersect(t_game *game, t_rcast *rcast, t_vec *ray) { ray->start.x = rcast->ray.start.x + game->plr.pos.x; ray->start.y = rcast->ray.start.y + game->plr.pos.y; ray->end.x = rcast->ray.end.x + game->plr.pos.x; - ray->end.x += rcast->ray_nb * SCREEN_SIZE / SCREEN_DEF; + ray->end.x += rcast->ray_nb; ray->end.y = rcast->ray.end.y + game->plr.pos.y; rotate(&(game->plr), &(ray->end)); init_raycast(rcast, ray); init_first_step(rcast, ray); - // loop through grid while (!is_wall(game, rcast->cell_x, rcast->cell_y)) next_cell(rcast); - // end ray position - calcul_ray_end(rcast, ray); } diff --git a/srcs/draw/raycast.c b/srcs/draw/raycast.c index 99d05e4..7fbe603 100644 --- a/srcs/draw/raycast.c +++ b/srcs/draw/raycast.c @@ -1,19 +1,57 @@ #include "cube3d.h" +// tmp, to draw rays + static void calcul_ray_end(t_rcast *rcast, t_vec *ray) + { + if (rcast->is_x) + { + ray->end.x = rcast->cell_x * rcast->cell; + if (rcast->ray_sign_x == 1) + ray->end.x += rcast->cell; + if (rcast->slope_x) + { + rcast->ratio = (double)(ray->end.x - ray->start.x); + rcast->ratio /= (double)rcast->slope_x; + ray->end.y = ray->start.y + (double)rcast->slope_y * rcast->ratio; + } + } + else + { + ray->end.y = rcast->cell_y * rcast->cell; + if (rcast->ray_sign_y == 1) + ray->end.y += rcast->cell; + if (rcast->slope_y) + { + rcast->ratio = (double)(ray->end.y - ray->start.y); + rcast->ratio /= (double)rcast->slope_y; + ray->end.x = ray->start.x + (double)rcast->slope_x * rcast->ratio; + } + } + } +// tmp end + +void draw_column(t_game *game, t_rcast *rcast, t_vec *ray) +{ + (void)game; + (void)rcast; + (void)ray; +} + void raycast(t_game *game, t_rcast *rcast) { t_vec ray; rcast->ray_nb = 0; - while (rcast->ray_nb <= SCREEN_DEF) + while (rcast->ray_nb <= rcast->screen_def) { ray_intersect(game, rcast, &ray); // tmp, to draw the map + calcul_ray_end(rcast, &ray); draw_line(game, ray, 0x00FF00FF); // tmp end - // draw_column(); + draw_column(game, rcast, &ray); (rcast->ray_nb)++; } } diff --git a/srcs/hook/keyhook.c b/srcs/hook/keyhook.c index f45e6d0..8641fd2 100644 --- a/srcs/hook/keyhook.c +++ b/srcs/hook/keyhook.c @@ -1,12 +1,12 @@ #include "cube3d.h" // temp, to map all the keys on linux and mac -static int print_keycode(int keycode) -{ - ft_putnbr_fd(keycode, 1); - ft_putchar_fd('\n', 1); - return(0); -} + static int print_keycode(int keycode) + { + ft_putnbr_fd(keycode, 1); + ft_putchar_fd('\n', 1); + return(0); + } // temp end int hook_action(t_game *game) @@ -38,7 +38,7 @@ int keypress(int keycode, t_game *game) unsigned i; // temp - print_keycode(keycode); + print_keycode(keycode); // temp end i = 0; @@ -48,7 +48,7 @@ int keypress(int keycode, t_game *game) game->k_hook[i] = 0; else if (i < MAX_NB_KEY) game->k_hook[i] = keycode; - hook_action(game); +// hook_action(game); return (0); } diff --git a/srcs/init/init_struct.c b/srcs/init/init_struct.c index b5d0307..d2d465e 100644 --- a/srcs/init/init_struct.c +++ b/srcs/init/init_struct.c @@ -12,6 +12,7 @@ static void init_map(t_map *map) { map->size_x = 24; map->size_y = 24; + map->cell = CELL; // map int tmp[24][24] = { {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, @@ -64,21 +65,26 @@ static void init_map(t_map *map) static void init_raycast(t_rcast *rcast) { - // draw screen dist + double dist; + + dist = (SCREEN_FOCAL / 2) * M_PI / 180; + dist = cos(dist) * ((SCREEN_WIDTH / 2) / sin(dist)); + rcast->screen_def = SCREEN_WIDTH; + // screen dist rcast->screen_dist.start.x = 0; rcast->screen_dist.start.y = 0; rcast->screen_dist.end.x = 0; - rcast->screen_dist.end.y = -SCREEN_DIST; - // draw screen size - rcast->screen_size.start.x = -SCREEN_SIZE / 2; - rcast->screen_size.start.y = -SCREEN_DIST; - rcast->screen_size.end.x = SCREEN_SIZE / 2; - rcast->screen_size.end.y = -SCREEN_DIST; - // draw ray + rcast->screen_dist.end.y = -dist; + // screen size + rcast->screen_size.start.x = -SCREEN_WIDTH / 2; + rcast->screen_size.start.y = -dist; + rcast->screen_size.end.x = SCREEN_WIDTH / 2; + rcast->screen_size.end.y = -dist; + // first ray rcast->ray.start.x = 0; rcast->ray.start.y = 0; - rcast->ray.end.x = -SCREEN_SIZE / 2; - rcast->ray.end.y = -SCREEN_DIST; + rcast->ray.end.x = -SCREEN_WIDTH / 2; + rcast->ray.end.y = -dist; } static void init_plr(t_plr *plr) @@ -105,20 +111,30 @@ t_game *init_game(void) init_map(&(game->map)); // plr init_plr(&(game->plr)); - // size window map - game->map_win.size_x = game->map.size_x * CELL; - game->map_win.size_y = game->map.size_y * CELL; // init connexion to server game->mlx_ptr = mlx_init(); mb_add(game->mlx_ptr); - // create the window - game->map_win.ptr = mlx_new_window(game->mlx_ptr, game->map_win.size_x, - game->map_win.size_y, "test"); + + // tmp draw map + // size window map + game->map_win.size_x = game->map.size_x * CELL; + game->map_win.size_y = game->map.size_y * CELL + SCREEN_HEIGHT; + // create the window + game->map_win.ptr = mlx_new_window(game->mlx_ptr, game->map_win.size_x, + game->map_win.size_y, "map"); + // create image and get its data address + init_img(&(game->map_img), game); + // tmp end + + game->win.size_x = SCREEN_WIDTH; + game->win.size_y = SCREEN_HEIGHT; + game->win.ptr = mlx_new_window(game->mlx_ptr, game->win.size_x, + game->win.size_y, "cub3d"); + init_img(&(game->img), game); // k(ey)_hook is the array containing the values of key press events ft_bzero(&game->k_hook, sizeof(game->k_hook)); // raycasting init_raycast(&(game->rcast)); - // create image and get its data address - init_img(&(game->map_img), game); + game->rcast.cell = game->map.cell; return (game); } diff --git a/srcs/player/player_limits.c b/srcs/player/player_limits.c index 7d9481a..9890d6d 100644 --- a/srcs/player/player_limits.c +++ b/srcs/player/player_limits.c @@ -20,8 +20,8 @@ int plr_out_limits(t_game *game, int x, int y) xmax = game->map_img.sizel / (game->map_img.bpp / 8); ymax = game->map_win.size_y; - cell_x = x / CELL; - cell_y = y / CELL; + cell_x = x / game->map.cell; + cell_y = y / game->map.cell; if (is_wall(game, cell_x, cell_y)) return (1); if (x < 0 || y < 0 || x > xmax || y > ymax)