diff --git a/inc/cub3d.h b/inc/cub3d.h index 37eb312..ab5e595 100644 --- a/inc/cub3d.h +++ b/inc/cub3d.h @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* ::: :::::::: */ -/* cub3d.h :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: qmennen +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/04/15 12:22:29 by qmennen #+# #+# */ -/* Updated: 2025/05/06 19:10:44 by qmennen ### ########.fr */ +/* :::::::: */ +/* cub3d.h :+: :+: */ +/* +:+ */ +/* By: qmennen +#+ */ +/* +#+ */ +/* Created: 2025/04/15 12:22:29 by qmennen #+# #+# */ +/* Updated: 2025/05/09 15:05:36 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -31,7 +31,7 @@ # define WHITE "\033[0;37m" # define NUM_KEYS 256 -# define TILE_SIZE 16 +# define TILE_SIZE 8 # include "MLX42.h" # include "allowed.h" diff --git a/inc/render.h b/inc/render.h index 766e2a8..6e85d87 100644 --- a/inc/render.h +++ b/inc/render.h @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* ::: :::::::: */ -/* render.h :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: qmennen +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/04/15 16:28:16 by qmennen #+# #+# */ -/* Updated: 2025/05/08 14:50:38 by qmennen ### ########.fr */ +/* :::::::: */ +/* render.h :+: :+: */ +/* +:+ */ +/* By: qmennen +#+ */ +/* +#+ */ +/* Created: 2025/04/15 16:28:16 by qmennen #+# #+# */ +/* Updated: 2025/05/09 14:34:27 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -20,7 +20,7 @@ void render_line(t_screen *screen, t_vec2 start, t_vec2 end, unsigned int color) void render_circle(t_screen *screen, t_vec2 point, int radius, unsigned int color); void render_clear(t_screen *screen); void render_entities(t_game *game); -void render_map(t_screen *screen, t_map *map); +void render_map(t_game *game); void cast_rays(t_game *game); void render_sprites(t_render* render, t_game *game); diff --git a/inc/types.h b/inc/types.h index 6940a86..10f5b5a 100644 --- a/inc/types.h +++ b/inc/types.h @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* ::: :::::::: */ -/* types.h :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: qmennen +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/04/15 15:52:44 by qmennen #+# #+# */ -/* Updated: 2025/05/08 14:51:17 by qmennen ### ########.fr */ +/* :::::::: */ +/* types.h :+: :+: */ +/* +:+ */ +/* By: qmennen +#+ */ +/* +#+ */ +/* Created: 2025/04/15 15:52:44 by qmennen #+# #+# */ +/* Updated: 2025/05/09 12:39:56 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -57,6 +57,7 @@ typedef struct s_sprite int n_frames; double dist; double cam_frac; + double alpha; mlx_texture_t *texture; t_vec2 pos; } t_sprite; diff --git a/src/game.c b/src/game.c index 387ea73..b662a06 100644 --- a/src/game.c +++ b/src/game.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* ::: :::::::: */ -/* game.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: qmennen +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/04/15 15:46:08 by qmennen #+# #+# */ -/* Updated: 2025/05/08 16:35:41 by qmennen ### ########.fr */ +/* :::::::: */ +/* game.c :+: :+: */ +/* +:+ */ +/* By: qmennen +#+ */ +/* +#+ */ +/* Created: 2025/04/15 15:46:08 by qmennen #+# #+# */ +/* Updated: 2025/05/09 14:51:14 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -57,13 +57,13 @@ void game_loop(void *param) render_clear(game->screen); player_update(game, delta_time); cast_rays(game); - render_map(game->screen, game->map); - render_entities(game); + render_map(game); + //render_entities(game); keyboard_update(game); if (game->player->is_moving) { game->screen->img->instances[0].x = (int)(sin((double)framecount / 4.0) * 20); - game->screen->img->instances[0].y = (int)(( 0.5 * cos((double)framecount / 2.0)) * 20); + game->screen->img->instances[0].y = (int)(( 0.5 * cos((double)framecount / 2.0)) * 20); } } diff --git a/src/render/DDAscratch.c b/src/render/DDAscratch.c index 87a9a70..7b4f599 100644 --- a/src/render/DDAscratch.c +++ b/src/render/DDAscratch.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* ::: :::::::: */ -/* DDAscratch.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: qmennen +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/05/02 11:58:09 by whaffman #+# #+# */ -/* Updated: 2025/05/08 16:56:17 by qmennen ### ########.fr */ +/* :::::::: */ +/* DDAscratch.c :+: :+: */ +/* +:+ */ +/* By: qmennen +#+ */ +/* +#+ */ +/* Created: 2025/05/02 11:58:09 by whaffman #+# #+# */ +/* Updated: 2025/05/09 15:20:04 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ diff --git a/src/render/render.c b/src/render/render.c index 98a9483..a49deb9 100644 --- a/src/render/render.c +++ b/src/render/render.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/04/15 16:28:10 by qmennen #+# #+# */ -/* Updated: 2025/05/07 11:38:34 by whaffman ######## odam.nl */ +/* Updated: 2025/05/09 15:20:24 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -43,7 +43,7 @@ void render_tile(t_screen *screen, int x, int y, t_tile tile) } } -void render_map(t_screen *screen, t_map *map) +void render_map2(t_screen *screen, t_map *map) { int i; int x; diff --git a/src/render/render_minimap.c b/src/render/render_minimap.c new file mode 100644 index 0000000..7e9103d --- /dev/null +++ b/src/render/render_minimap.c @@ -0,0 +1,49 @@ +#include "cub3d.h" + + +#define MINIMAP_SIZE 200 +void render_map(t_game *game) +{ + t_vec2_int disp; + t_vec2 map; + + disp.x = 0; + while (disp.x < MINIMAP_SIZE) + { + disp.y = 0; + while (disp.y < MINIMAP_SIZE) + { + if (disp.x == 0.5 * MINIMAP_SIZE || disp.y == 0.5 * MINIMAP_SIZE) + { + mlx_put_pixel(game->screen->minimap, disp.x, disp.y, 0x00ff00dd); + disp.y++; + continue ; + } + if ((disp.x - 0.5 * MINIMAP_SIZE) *(disp.x - 0.5 * MINIMAP_SIZE) + (disp.y - 0.5 * MINIMAP_SIZE) * (disp.y - 0.5 * MINIMAP_SIZE) > 0.25* MINIMAP_SIZE * MINIMAP_SIZE) + { + disp.y++; + continue ; + } + map.x = ((double)disp.x/TILE_SIZE) + game->player->pos.x - (0.5 * MINIMAP_SIZE/TILE_SIZE); + map.y = ((double)disp.y/TILE_SIZE) + game->player->pos.y - (0.5 * MINIMAP_SIZE/TILE_SIZE); + if (map.x < 0 || map.x >= game->map->width + || map.y < 0 || map.y >= game->map->height) + { + mlx_put_pixel(game->screen->minimap, disp.x, disp.y, 0x00ff0044); + + disp.y++; + continue ; + } + if (game->map->grid[(int)map.y][(int)map.x] == TILE_WALL) + mlx_put_pixel(game->screen->minimap, disp.x, disp.y, 0x00ff00ff); + else if (game->map->grid[(int)map.y][(int)map.x] == TILE_EMPTY + || game->map->grid[(int)map.y][(int)map.x] == TILE_PLAYER) + mlx_put_pixel(game->screen->minimap, disp.x, disp.y, 0x00ff0077); + else + mlx_put_pixel(game->screen->minimap, disp.x, disp.y, 0x00ff0044); + disp.y++; + } + disp.x++; + + } +} \ No newline at end of file diff --git a/src/render/render_sprite.c b/src/render/render_sprite.c index ba2b553..798db10 100644 --- a/src/render/render_sprite.c +++ b/src/render/render_sprite.c @@ -6,39 +6,60 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/05/08 12:23:17 by qmennen #+# #+# */ -/* Updated: 2025/05/08 23:18:06 by whaffman ######## odam.nl */ +/* Updated: 2025/05/09 15:13:05 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "render.h" -static void sort_sprites(t_game *game) +static void sort_sprites(t_game *game) { - t_sprite sprite_temp; - int n; - int i; - int new_n; + int i; + int j; + t_sprite key; - n = game->map->n_sprites; - while (n > 1) + i = 1; + while (i < game->map->n_sprites) { - i = 1; - new_n = 0; - while (i <= n - 1) + key = game->map->sprites[i]; + j = i - 1; + while (j >= 0 && game->map->sprites[j].dist < key.dist) { - if (game->map->sprites[i - 1].dist < game->map->sprites[i].dist) - { - sprite_temp = game->map->sprites[i - 1]; - game->map->sprites[i - 1] = game->map->sprites[i]; - game->map->sprites[i] = sprite_temp; - new_n = i; - } - i++; + game->map->sprites[j + 1] = game->map->sprites[j]; + j--; } - n = new_n; + game->map->sprites[j + 1] = key; + i++; } } +// static void sort_sprites(t_game *game) +// { +// t_sprite sprite_temp; +// int n; +// int i; +// int new_n; + +// n = game->map->n_sprites; +// while (n > 1) +// { +// i = 1; +// new_n = 0; +// while (i <= n - 1) +// { +// if (game->map->sprites[i - 1].dist < game->map->sprites[i].dist) +// { +// sprite_temp = game->map->sprites[i - 1]; +// game->map->sprites[i - 1] = game->map->sprites[i]; +// game->map->sprites[i] = sprite_temp; +// new_n = i; +// } +// i++; +// } +// n = new_n; +// } +// } + static void calculate_sprite_dist(t_game *game) { int i; @@ -48,7 +69,7 @@ static void calculate_sprite_dist(t_game *game) player_pos = game->player->pos; while (i < game->map->n_sprites) { - game->map->sprites[i].dist = dist_point_line(game->map->sprites[i].pos, + game->map->sprites[i].dist = dist_point_line(game->map->sprites[i].pos, (t_vec2_line){player_pos, game->player->camera}); i++; } @@ -78,27 +99,41 @@ static void cam_fraction(t_game *game, t_sprite *sprite) } return; } - -unsigned int sample_texture_color(mlx_texture_t *texture, int x, int y, double dist) +unsigned int calculate_alpha(mlx_texture_t *texture, int x, int y, double dist) { - int index; - int alpha; + int index; + int alpha; index = (x + y * texture->width) * texture->bytes_per_pixel; dist = (dist > 1) * dist + (dist <= 1) * 1; - alpha = (texture->pixels[index + 3] != 0) * (255.0 / dist); - return texture->pixels[index] << 24 | texture->pixels[index + 1] << 16 | texture->pixels[index + 2] << 8 | alpha; + alpha = (255.0 / dist); + return (alpha); +} + +unsigned int sample_texture_color(mlx_texture_t *texture, int x, int y, int alpha) +{ + int index; + + index = (x + y * texture->width) * texture->bytes_per_pixel; + return (texture->pixels[index] << 24 + | texture->pixels[index + 1] << 16 + | texture->pixels[index + 2] << 8 + | (texture->pixels[index + 3] != 0) * alpha); } void draw_sprite(t_game *game, t_sprite *sprite, t_render *render) { double sprite_scale; + double x_invrange; + double y_invrange; int x_start; int y_start; int x_end; int y_end; + int x; int y; + int alpha; double tex_x; double tex_y; unsigned int color; @@ -110,17 +145,20 @@ void draw_sprite(t_game *game, t_sprite *sprite, t_render *render) y_start = (game->screen->height - sprite->texture->height * sprite_scale )* 0.5; x_end = x_start + (sprite->texture->width * sprite_scale); y_end = y_start + (sprite->texture->height * sprite_scale); + y_invrange = 1.0 / (y_end - y_start); + x_invrange = 1.0 / (x_end - x_start); x = x_start; + alpha = calculate_alpha(sprite->texture, x_start, y_start, sprite->dist); while (x < x_end) { if (x > 0 && x < game->screen->width && sprite->dist <= render[x].perp_dist) { y = y_start; - tex_x = ((double)((x - x_start) / (double)(x_end - x_start))) * sprite->texture->width; + tex_x = (x - x_start) * x_invrange * sprite->texture->width; while (y < y_end) { - tex_y = ((double)((y- y_start) / (double)(y_end - y_start))) * sprite->texture->height; - color = sample_texture_color(sprite->texture, (int)(tex_x), (int)(tex_y), sprite->dist); + tex_y = (y- y_start) * y_invrange * sprite->texture->height; + color = sample_texture_color(sprite->texture, (int)(tex_x), (int)(tex_y), alpha); if (y > 0 && y < game->screen->height && (color & 0xFF) != 0) { mlx_put_pixel(game->screen->img, x, y, color); diff --git a/src/screen.c b/src/screen.c index f9578c7..68eb603 100644 --- a/src/screen.c +++ b/src/screen.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* ::: :::::::: */ -/* screen.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: qmennen +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/04/15 15:30:27 by qmennen #+# #+# */ -/* Updated: 2025/05/08 17:10:50 by qmennen ### ########.fr */ +/* :::::::: */ +/* screen.c :+: :+: */ +/* +:+ */ +/* By: qmennen +#+ */ +/* +#+ */ +/* Created: 2025/04/15 15:30:27 by qmennen #+# #+# */ +/* Updated: 2025/05/09 15:27:37 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -22,7 +22,7 @@ int screen_create(t_game **game) return (FAILURE); screen->width = WIDTH; screen->height = HEIGHT; - mlx_set_setting(MLX_FULLSCREEN, 1); + mlx_set_setting(MLX_FULLSCREEN, 0); mlx = mlx_init(WIDTH, HEIGHT, TITLE, true); if (!mlx) return (FAILURE); @@ -78,7 +78,7 @@ int screen_display(t_screen *screen) printf(RED"Failed to display buffer image\n"RESET); return (FAILURE); } - if (mlx_image_to_window(screen->mlx, screen->minimap, 0, 0) < 0) + if (mlx_image_to_window(screen->mlx, screen->minimap, 200, 200) < 0) { printf(RED"Failed to display buffer image\n"RESET); return (FAILURE); diff --git a/src/util/initialize.c b/src/util/initialize.c index 431f943..82d84fb 100644 --- a/src/util/initialize.c +++ b/src/util/initialize.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* ::: :::::::: */ -/* initialize.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: qmennen +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/04/22 17:08:26 by qmennen #+# #+# */ -/* Updated: 2025/05/08 17:28:50 by qmennen ### ########.fr */ +/* :::::::: */ +/* initialize.c :+: :+: */ +/* +:+ */ +/* By: qmennen +#+ */ +/* +#+ */ +/* Created: 2025/04/22 17:08:26 by qmennen #+# #+# */ +/* Updated: 2025/05/09 13:07:25 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -42,7 +42,32 @@ static int init_temp(t_game **game) (*game)->map->sprites[4].pos.y = 5.5; (*game)->map->sprites[4].dist = 0; (*game)->map->sprites[4].texture = mlx_load_png("./assets/lamp.png"); - (*game)->map->n_sprites = 5; + (*game)->map->sprites[5].n_frames = 1; + (*game)->map->sprites[5].pos.x = 10.5; + (*game)->map->sprites[5].pos.y = 6.5; + (*game)->map->sprites[5].dist = 0; + (*game)->map->sprites[5].texture = mlx_load_png("./assets/battery.png"); + (*game)->map->sprites[6].n_frames = 1; + (*game)->map->sprites[6].pos.x = 14.5; + (*game)->map->sprites[6].pos.y = 3.5; + (*game)->map->sprites[6].dist = 0; + (*game)->map->sprites[6].texture = mlx_load_png("./assets/battery.png"); + (*game)->map->sprites[7].n_frames = 1; + (*game)->map->sprites[7].pos.x = 36.5; + (*game)->map->sprites[7].pos.y = 3.5; + (*game)->map->sprites[7].dist = 0; + (*game)->map->sprites[7].texture = mlx_load_png("./assets/battery.png"); + (*game)->map->sprites[8].n_frames = 1; + (*game)->map->sprites[8].pos.x = 42.5; + (*game)->map->sprites[8].pos.y = 4.5; + (*game)->map->sprites[8].dist = 0; + (*game)->map->sprites[8].texture = mlx_load_png("./assets/broken_mirror.png"); + (*game)->map->sprites[9].n_frames = 1; + (*game)->map->sprites[9].pos.x = 9.5; + (*game)->map->sprites[9].pos.y = 10.5; + (*game)->map->sprites[9].dist = 0; + (*game)->map->sprites[9].texture = mlx_load_png("./assets/lamp.png"); + (*game)->map->n_sprites = 10; (*game)->screen->hud = mlx_texture_to_image((*game)->screen->mlx, mlx_load_png("./assets/overlay.png")); return (SUCCESS); } diff --git a/test.cub b/test.cub index b333438..6084b6a 100644 --- a/test.cub +++ b/test.cub @@ -14,7 +14,7 @@ C 100,100,200 1111111 111 1111 111111 1111111111 111111 -1000001110111001 100001 1000001001 10001 +1000001110111001 100001 1000000001 10001 1001000000000001 100001 100000110111100011 1000001110000001110011111111 110000001000000001 1000001 10001000000010000001 100000001000000001