diff --git a/headers/cube3d_macro.h b/headers/cube3d_macro.h index 0900fab..b49dcdb 100644 --- a/headers/cube3d_macro.h +++ b/headers/cube3d_macro.h @@ -20,7 +20,7 @@ /* screen focal (in degree) */ # define SCREEN_FOCAL 70 /* size of a cell on the map */ -# define CELL 100 +# define CELL 20 /* * keys macro diff --git a/headers/cube3d_struct.h b/headers/cube3d_struct.h index eca8f0b..6940830 100644 --- a/headers/cube3d_struct.h +++ b/headers/cube3d_struct.h @@ -163,6 +163,16 @@ typedef struct s_game t_txt txt; // map t_map map; + + //tmp draw map + // map window + t_win map_win; + t_img map_img; + // rays + int ray_highlight; + int ray_activ; + // tmp end + // key hook int k_hook[MAX_NB_KEY]; } t_game; diff --git a/srcs/draw/draw.c b/srcs/draw/draw.c index c24dc2e..1bfa60c 100644 --- a/srcs/draw/draw.c +++ b/srcs/draw/draw.c @@ -1,5 +1,89 @@ #include "cube3d.h" +// tmp draw map + static void draw_square(t_game *game, t_coord pos, int border, int fill, int size, int rotation) + { + int i; + int j; + t_coord new; + + i = 0; + while (i < size) + { + j = 0; + while (j < size) + { + new.x = pos.x + j; + new.y = pos.y + i; + if (rotation) + rotate(&(game->plr), &(new)); + if (!i || i == size - 1) + draw_pixel(&game->map_img, new.x, new.y, border); + else if (!j || j == size - 1) + draw_pixel(&game->map_img, new.x, new.y, border); + else + draw_pixel(&game->map_img, new.x, new.y, fill); + j++; + } + i++; + } + } + + static void draw_map(t_game *game) + { + t_coord incr; + t_coord pos; + int cell; + + cell = game->map.cell; + incr.x = 0; + pos.x = 0; + pos.y = 0; + while ((game->map.content)[incr.x]) + { + incr.y = 0; + 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); + else + draw_square(game, pos, 0x00555555, 0x00333333, cell, 0); + (incr.y)++; + pos.x += cell; + } + (incr.x)++; + pos.x = 0; + 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); + } + +/* + static void draw_screen(t_game *game, t_rcast *rcast) + { + t_vec screen; + + // draw screen size + screen.start.x = rcast->screen_size.start.x + game->plr.pos.x; + screen.start.y = rcast->screen_size.start.y + game->plr.pos.y; + rotate(&(game->plr), &(screen.start)); + screen.end.x = rcast->screen_size.end.x + game->plr.pos.x; + screen.end.y = rcast->screen_size.end.y + game->plr.pos.y; + rotate(&(game->plr), &(screen.end)); + draw_line(&game->map_img, &screen, 0x00FFFFFF); + // draw screen dist + screen.start.x = rcast->screen_dist.start.x + game->plr.pos.x; + screen.start.y = rcast->screen_dist.start.y + game->plr.pos.y; + screen.end.x = rcast->screen_dist.end.x + game->plr.pos.x; + screen.end.y = rcast->screen_dist.end.y + game->plr.pos.y; + rotate(&(game->plr), &(screen.end)); + draw_line(&game->map_img, &screen, 0x00FFFFFF); + } +*/ +// tmp end + static int pxl_out_limits(t_img *img, int x, int y) { int xmax; @@ -44,6 +128,16 @@ void draw_line(t_img *img, t_vec *vec, int color) void draw(t_game *game) { + // tmp draw map + draw_map(game); + // tmp end + raycast(game, &(game->rcast)); + + // tmp draw map +// draw_screen(game, &(game->rcast)); + 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/raycast.c b/srcs/draw/raycast.c index 4648808..2c41435 100644 --- a/srcs/draw/raycast.c +++ b/srcs/draw/raycast.c @@ -1,5 +1,35 @@ #include "cube3d.h" +// tmp draw map + 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 + static void calcul_img_column(t_game *game, t_rcast *rcast, t_wall *wall) { int tmp; @@ -63,7 +93,24 @@ void raycast(t_game *game, t_rcast *rcast) rcast->ray_nb = 0; while (rcast->ray_nb <= rcast->screen_width) { + // tmp draw map + // rays + game->ray_activ = 0; + if (rcast->ray_nb == game->ray_highlight) + game->ray_activ = 1; + //if (game->ray_activ) printf("hello\n"); + // tmp end + ray_intersect_wall(game, rcast, &ray); + + // tmp draw map + calcul_ray_end(rcast, &ray); + if (game->ray_activ) + draw_line(&game->map_img, &ray, 0x00FF00FF); + else if (rcast->ray_nb % 10 == 0) + draw_line(&game->map_img, &ray, 0x00FFFFFF); + // tmp end + calcul_wall(rcast); calcul_img_column(game, rcast, &rcast->wall); draw_column(game, rcast, &rcast->wall, &game->txt); diff --git a/srcs/hook/keyhook.c b/srcs/hook/keyhook.c index a4cad21..3a60df4 100644 --- a/srcs/hook/keyhook.c +++ b/srcs/hook/keyhook.c @@ -30,6 +30,28 @@ int hook_action(t_game *game) plr_turn_left(&(game->plr)); if (is_turn_right(game->k_hook, &is_action)) plr_turn_right(&(game->plr)); + + // tmp draw map + // temp display one ray with infos + if (!ft_arrint(game->k_hook, 65364, MAX_NB_KEY)) + { + if (game->ray_highlight <= SCREEN_WIDTH) + game->ray_highlight++; + else + game->ray_highlight = -1; + is_action = 1; + } + if (!ft_arrint(game->k_hook, 65362, MAX_NB_KEY)) + { + if (game->ray_highlight >= 0) + game->ray_highlight--; + else + game->ray_highlight = SCREEN_WIDTH; + is_action = 1; + } + // temp end + // tmp end + if (is_action) draw(game); return(0); diff --git a/srcs/init/init_game.c b/srcs/init/init_game.c index e5463ee..5f1ceb7 100644 --- a/srcs/init/init_game.c +++ b/srcs/init/init_game.c @@ -51,6 +51,17 @@ void init_game(t_game *game) // init connexion to server game->mlx_ptr = mlx_init(); mb_add(game->mlx_ptr); + + // tmp draw map + game->map_win.size_x = game->map.size_x * CELL; + game->map_win.size_y = game->map.size_y * CELL + SCREEN_HEIGHT; + game->map_win.ptr = mlx_new_window(game->mlx_ptr, game->map_win.size_x, game->map_win.size_y, "map"); + init_img(&(game->map_img), game->mlx_ptr, &(game->map_win)); + // ray + game->ray_highlight = -1; + game->ray_activ = 0; + // tmp end + // create window game->win.size_x = SCREEN_WIDTH; game->win.size_y = SCREEN_HEIGHT;