From 3c76a8646ad8cc2743f89bae1d4507be612ff139 Mon Sep 17 00:00:00 2001 From: hugogogo Date: Wed, 4 May 2022 00:55:47 +0200 Subject: [PATCH] plr orientation at begining --- Makefile | 2 +- headers/cube3d_macro.h | 2 +- headers/cube3d_proto.h | 1 + headers/cube3d_struct.h | 15 ++-- maps/map_valid_14.cub | 6 +- srcs/cube3d.c | 8 +- srcs/draw/draw.c | 145 +++++++++++++++-------------------- srcs/draw/draw_column.c | 13 ++-- srcs/draw/raycast.c | 92 +++++++++++----------- srcs/hook/keyhook.c | 35 ++++----- srcs/init/init_game.c | 20 +++-- srcs/parsing/check_map.c | 7 +- srcs/player/player_rotates.c | 23 ++---- 13 files changed, 176 insertions(+), 193 deletions(-) diff --git a/Makefile b/Makefile index f1efa2a..7177f94 100644 --- a/Makefile +++ b/Makefile @@ -79,7 +79,7 @@ RM_OBJS = rm -rf $(D_OBJS) # flags CFLAGS = -Wall -Wextra -Werror $(INCLUDES) -CFLAGS += -g3 +CFLAGS += -g3 -Wno-unused LFLAGS = -L$(D_LFT) -lft LFLAGS += -L$(D_LMLX) -lm -lmlx -lXext -lX11 diff --git a/headers/cube3d_macro.h b/headers/cube3d_macro.h index 516f984..0900fab 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 40 +# define CELL 100 /* * keys macro diff --git a/headers/cube3d_proto.h b/headers/cube3d_proto.h index 7ce4f9f..32b21c9 100644 --- a/headers/cube3d_proto.h +++ b/headers/cube3d_proto.h @@ -71,6 +71,7 @@ void plr_posy_increment(t_game *game, t_plr *plr); // player_rotates.c void rotate(t_plr *plr, t_coord *coord); void rotate_double(t_plr *plr, t_d_coord *coord); +void plr_turn(t_plr *plr, int deg); void plr_turn_right(t_plr *plr); void plr_turn_left(t_plr *plr); // player_limits.c diff --git a/headers/cube3d_struct.h b/headers/cube3d_struct.h index 5028341..542f315 100644 --- a/headers/cube3d_struct.h +++ b/headers/cube3d_struct.h @@ -125,6 +125,7 @@ typedef struct s_map int cell; int plr_x; int plr_y; + int plr_dir; } t_map; /* @@ -165,13 +166,13 @@ typedef struct s_game t_map map; //tmp draw map - // map window - t_win map_win; - t_img map_img; - // rays - int ray_highlight; - int ray_activ; - t_vec ray; + // // map window + // t_win map_win; + // t_img map_img; + // // rays + // int ray_highlight; + // int ray_activ; + // t_vec ray; // tmp end // key hook diff --git a/maps/map_valid_14.cub b/maps/map_valid_14.cub index bf6b67e..a931217 100644 --- a/maps/map_valid_14.cub +++ b/maps/map_valid_14.cub @@ -1,4 +1,4 @@ -NO textures/door.xpm +NO textures/coin.xpm SO textures/chalice.xpm EA textures/brick.xpm WE textures/wood.xpm @@ -8,12 +8,12 @@ F 220 , 100, 30 C 225 , 30 , 0 1111111111111111111111111111 -1000000000000000011100000001 +10000000000000000111N0000001 1111000000000000100000110001 1111001000000000000110000111 1000000000000000010101000001 1111110000000000000000001111 -10000000000000000N0000000001 +1000000000000000000000000001 1000000000000000000000000001 1000000000000000000000000001 1000000000000000000000000001 diff --git a/srcs/cube3d.c b/srcs/cube3d.c index 427b991..c46699a 100644 --- a/srcs/cube3d.c +++ b/srcs/cube3d.c @@ -32,13 +32,19 @@ int main(int ac, char **av) { t_game *game; + /* if ((ac != 2 || check_extension(av[1], ".cub")) && \ write(2, "Error\nPlease use a valid .cub file as single argument.\n", 53)) return (EXIT_FAILURE); + */ game = init_struct(); mb_init(destroy_mlx, game); - if (init_parsing(game, av[1]) && write(2, "The .cub file is invalid.\n", 26)) + + if (init_parsing(game, "maps/map_valid_14.cub") && write(2, "The .cub file is invalid.\n", 26)) return (EXIT_FAILURE); +// if (init_parsing(game, av[1]) && write(2, "The .cub file is invalid.\n", 26)) +// return (EXIT_FAILURE); + if (check_map(&(game->map)) && write(2, "The map is invalid.\n", 20)) return (EXIT_FAILURE); init_game(game); diff --git a/srcs/draw/draw.c b/srcs/draw/draw.c index 1bfa60c..73e0aa4 100644 --- a/srcs/draw/draw.c +++ b/srcs/draw/draw.c @@ -1,87 +1,64 @@ #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); - } -*/ +// 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); +// } // tmp end static int pxl_out_limits(t_img *img, int x, int y) @@ -129,14 +106,14 @@ void draw_line(t_img *img, t_vec *vec, int color) void draw(t_game *game) { // tmp draw map - draw_map(game); + // 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); + // 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/draw_column.c b/srcs/draw/draw_column.c index 9f87db8..ebb4185 100644 --- a/srcs/draw/draw_column.c +++ b/srcs/draw/draw_column.c @@ -42,13 +42,12 @@ static void draw_txt_column(t_game *game, t_wall *wall, t_img *txt_img) img_x = (wall->posx * txt_img->width) / game->rcast.cell; // tmp draw map - if (game->ray_activ) - { - printf("img_x:%i ", img_x); - draw_line(&game->img, &wall->vec, 0x00FF00FF); - return ; - } - + // if (game->ray_activ) + // { + // printf("img_x:%i ", img_x); + // draw_line(&game->img, &wall->vec, 0x00FF00FF); + // return ; + // } // tmp end j = wall->limit; diff --git a/srcs/draw/raycast.c b/srcs/draw/raycast.c index 2f61f13..8412032 100644 --- a/srcs/draw/raycast.c +++ b/srcs/draw/raycast.c @@ -1,33 +1,33 @@ #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; - } - } - } +// 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) @@ -43,8 +43,8 @@ static void calcul_img_column(t_game *game, t_rcast *rcast, t_wall *wall) tmp += game->plr.pos.y; // tmp draw map - if (game->ray_activ) - printf("tmp:%i ", tmp); + // if (game->ray_activ) + // printf("tmp:%i ", tmp); // tmp end wall->posx = tmp % rcast->cell; @@ -58,16 +58,16 @@ static void calcul_img_column(t_game *game, t_rcast *rcast, t_wall *wall) tmp += game->plr.pos.x; // tmp draw map - if (game->ray_activ) - printf("tmp:%i ", tmp); + // if (game->ray_activ) + // printf("tmp:%i ", tmp); // tmp end wall->posx = tmp % rcast->cell; } // tmp draw map - if (game->ray_activ) - printf("wall->posx:%i ", wall->posx); + // if (game->ray_activ) + // printf("wall->posx:%i ", wall->posx); // tmp end } @@ -119,23 +119,23 @@ void raycast(t_game *game, t_rcast *rcast) { // tmp draw map - // rays - game->ray_activ = 0; - if (rcast->ray_nb == game->ray_highlight) - { - game->ray_activ = 1; - game->ray = ray; - } + // // rays + // game->ray_activ = 0; + // if (rcast->ray_nb == game->ray_highlight) + // { + // game->ray_activ = 1; + // game->ray = ray; + // } // 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); + // 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); @@ -145,7 +145,7 @@ void raycast(t_game *game, t_rcast *rcast) } // tmp draw map - printf("\n\n"); + // printf("\n\n"); // tmp end } diff --git a/srcs/hook/keyhook.c b/srcs/hook/keyhook.c index 3a60df4..ae29798 100644 --- a/srcs/hook/keyhook.c +++ b/srcs/hook/keyhook.c @@ -32,24 +32,23 @@ int hook_action(t_game *game) 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 + // // ray + // 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; + // } // tmp end if (is_action) diff --git a/srcs/init/init_game.c b/srcs/init/init_game.c index 5f1ceb7..d216e53 100644 --- a/srcs/init/init_game.c +++ b/srcs/init/init_game.c @@ -42,6 +42,12 @@ static void init_plr(t_plr *plr, t_map *map) plr->cosj = 0; plr->sini = 0; plr->sinj = 0; + if (map->plr_dir == 'E') + plr_turn(plr, 90); + if (map->plr_dir == 'S') + plr_turn(plr, 180); + if (map->plr_dir == 'W') + plr_turn(plr, -90); } void init_game(t_game *game) @@ -53,13 +59,13 @@ void init_game(t_game *game) 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; + // 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 diff --git a/srcs/parsing/check_map.c b/srcs/parsing/check_map.c index 6b9f50f..31061af 100644 --- a/srcs/parsing/check_map.c +++ b/srcs/parsing/check_map.c @@ -6,17 +6,18 @@ /* By: pblagoje +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/04/18 12:37:48 by pblagoje #+# #+# */ -/* Updated: 2022/04/30 11:56:09 by simplonco ### ########.fr */ +/* Updated: 2022/05/04 00:51:54 by simplonco ### ########.fr */ /* */ /* ************************************************************************** */ #include "cube3d.h" -int set_player(t_map *map, int y, int x) +static int set_player(t_map *map, int y, int x, char dir) { map->plr_x = x; map->plr_y = y; map->content[y][x] = '0'; + map->plr_dir = dir; return (1); } @@ -76,7 +77,7 @@ int check_content(t_map *map) else if (!ft_strchr(" 01SNWE", map->content[y][x])) return (EXIT_FAILURE); else if (ft_strchr("SNWE", map->content[y][x]) \ - && set_player(map, y, x)) + && set_player(map, y, x, map->content[y][x])) count++; x++; } diff --git a/srcs/player/player_rotates.c b/srcs/player/player_rotates.c index 7cac745..7bc2b09 100644 --- a/srcs/player/player_rotates.c +++ b/srcs/player/player_rotates.c @@ -40,14 +40,14 @@ void rotate_double(t_plr *plr, t_d_coord *coord) coord->y = tmp.y + plr->exact.y; } -void plr_turn_left(t_plr *plr) +void plr_turn(t_plr *plr, int deg) { double radi; double radj; if (plr->rot == -180) (plr->rot) *= -1; - plr->rot -= plr->deg; + plr->rot += deg; // calculate trigo for rotations radi = plr->rot * M_PI / 180; radj = radi + (M_PI / 2); @@ -57,19 +57,12 @@ void plr_turn_left(t_plr *plr) plr->sinj = sin(radj); } +void plr_turn_left(t_plr *plr) +{ + plr_turn(plr, -plr->deg); +} + void plr_turn_right(t_plr *plr) { - double radi; - double radj; - - if (plr->rot == 180) - (plr->rot) *= -1; - plr->rot += plr->deg; - // calculate trigo for rotations - radi = plr->rot * M_PI / 180; - radj = radi + (M_PI / 2); - plr->cosi = cos(radi); - plr->sini = sin(radi); - plr->cosj = cos(radj); - plr->sinj = sin(radj); + plr_turn(plr, plr->deg); }