diff --git a/inc/cub3d.h b/inc/cub3d.h index 02286b6..02ec8a6 100644 --- a/inc/cub3d.h +++ b/inc/cub3d.h @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/15 12:22:29 by qmennen #+# #+# */ -/* Updated: 2025/04/15 18:55:25 by qmennen ### ########.fr */ +/* Updated: 2025/04/17 17:59:23 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,6 +21,7 @@ # include "game.h" # include "screen.h" # include "keyhandle.h" +# include "line.h" # include "render.h" # include "player.h" diff --git a/inc/line.h b/inc/line.h new file mode 100644 index 0000000..b81631c --- /dev/null +++ b/inc/line.h @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* line.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/04/17 17:49:09 by qmennen #+# #+# */ +/* Updated: 2025/04/17 17:59:09 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef LINE_H +# define LINE_H +# include "cub3d.h" + +void line_low(t_screen *screen, t_vec2 start, t_vec2 end, unsigned int color); +void line_high(t_screen *screen, t_vec2 start, t_vec2 end, unsigned int color); + +#endif diff --git a/inc/render.h b/inc/render.h index 36c4f88..54663d7 100644 --- a/inc/render.h +++ b/inc/render.h @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/15 16:28:16 by qmennen #+# #+# */ -/* Updated: 2025/04/15 18:55:54 by qmennen ### ########.fr */ +/* Updated: 2025/04/17 17:59:35 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,6 +15,8 @@ # include "cub3d.h" +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); diff --git a/src/line.c b/src/line.c new file mode 100644 index 0000000..8d636cc --- /dev/null +++ b/src/line.c @@ -0,0 +1,69 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* line.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/04/17 17:49:01 by qmennen #+# #+# */ +/* Updated: 2025/04/17 18:04:30 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "line.h" +#include "MLX42.h" + +void line_low(t_screen *screen, t_vec2 start, t_vec2 end, unsigned int color) +{ + int delta; + int yi; + t_vec2 current; + t_vec2 delta_point; + + delta_point.x = end.x - start.x; + delta_point.y = abs((int) end.y - (int) start.y); + yi = 1; + if (end.y - start.y < 0) + yi = -1; + delta = 2 * delta_point.y - delta_point.x; + current = start; + while (current.x <= end.x) + { + mlx_put_pixel(screen->img, (int)current.x, (int)current.y, color); + if (delta > 0) + { + current.y += yi; + delta -= 2 * delta_point.x; + } + delta += 2 * delta_point.y; + current.x++; + } +} + +void line_high(t_screen *screen, t_vec2 start, t_vec2 end, unsigned int color) +{ + int delta; + int xi; + t_vec2 current; + t_vec2 delta_point; + + delta_point.x = abs((int) end.x - (int) start.x); + delta_point.y = end.y - start.y; + xi = 1; + if (end.x - start.x < 0) + xi = -1; + delta = 2 * delta_point.x - delta_point.y; + current = start; + while (current.y <= end.y) + { + mlx_put_pixel(screen->img, (int)current.x, (int)current.y, color); + if (delta > 0) + { + current.x += xi; + delta -= 2 * delta_point.y; + } + delta += 2 * delta_point.x; + current.y++; + } +} + diff --git a/src/player.c b/src/player.c index 2fa10f8..2090ca9 100644 --- a/src/player.c +++ b/src/player.c @@ -6,11 +6,12 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/15 18:53:19 by qmennen #+# #+# */ -/* Updated: 2025/04/15 19:11:48 by qmennen ### ########.fr */ +/* Updated: 2025/04/17 18:10:17 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ #include "player.h" +#include "render.h" #include "types.h" int player_create(t_game **game) @@ -49,7 +50,11 @@ void player_move(keys_t key, t_player *player) void player_render(t_screen *screen, t_player *player) { + t_vec2 direction; if (player->pos.x < 0 || player->pos.x >= screen->width || player->pos.y < 0 || player->pos.y >= screen->height) return ; - mlx_put_pixel(screen->img, (int) player->pos.x, (int) player->pos.y, 0xFFFFFFFF); + render_circle(screen, player->pos, 10, 0x3294a8ff); + direction.x = player->pos.x + cos(player->angle) * 30; + direction.y = player->pos.y + sin(player->angle) * 30; + render_line(screen, player->pos, direction, 0xa83232ff); } diff --git a/src/render.c b/src/render.c index aca5b44..c99b910 100644 --- a/src/render.c +++ b/src/render.c @@ -6,12 +6,11 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/15 16:28:10 by qmennen #+# #+# */ -/* Updated: 2025/04/15 19:20:00 by qmennen ### ########.fr */ +/* Updated: 2025/04/17 17:59:14 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ #include "render.h" -#include "MLX42.h" void render_clear(t_screen *screen) { @@ -22,6 +21,48 @@ void render_clear(t_screen *screen) mlx_put_pixel(screen->img, i % screen->width, i / screen->width, 0x212121FF); } +void render_circle(t_screen *screen, t_vec2 point, int radius, unsigned int color) +{ + int i; + int size; + int x; + int y; + + i = 0; + size = 2 * radius + 1; + while (i <= size * size) + { + x = i % size - radius; + y = i / size - radius; + if (x * x + y * y <= radius * radius) + mlx_put_pixel(screen->img, (int) point.x + x, (int) point.y + y, color); + i++; + } +} + +void render_line(t_screen *screen, t_vec2 start, t_vec2 end, unsigned int color) +{ + if ((start.x < 0 || start.x >= (int) screen->img->width + || start.y < 0 || start.y >= (int) screen->img->height) + && (end.x < 0 || end.x >= (int) screen->img->width + || end.y < 0 || end.y >= (int) screen->img->height)) + return ; + if (abs((int) end.y - (int) start.y) < abs((int) end.x - (int) start.x)) + { + if (start.x > end.x) + line_low(screen, end, start, color); + else + line_low(screen, start, end, color); + } + else + { + if (start.y > end.y) + line_high(screen, end, start, color); + else + line_high(screen, start, end, color); + } +} + void render_entities(t_game *game) { player_render(game->screen, game->player);