From 98e0119c91417761ca452e0eedff098db0612215 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kha=C3=AFs=20COLIN?= Date: Thu, 7 Aug 2025 13:45:34 +0200 Subject: [PATCH 1/2] fix: prevent moving through walls in extreme lag situations --- .gitignore | 1 + Makefile | 1 + src/consts.h | 3 +- src/player/move.c | 96 +++++++++++++++--------------- src/player/move.h | 6 +- src/player/move_step.c | 130 +++++++++++++++++++++++++++++++++++++++++ src/player/move_step.h | 25 ++++++++ 7 files changed, 209 insertions(+), 53 deletions(-) create mode 100644 src/player/move_step.c create mode 100644 src/player/move_step.h diff --git a/.gitignore b/.gitignore index 4adb6eb..2c4516d 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ cub3d libft.a vgcore.* cscope.* +callgrind.out.* diff --git a/Makefile b/Makefile index 5a7bb4d..278d1d0 100644 --- a/Makefile +++ b/Makefile @@ -25,6 +25,7 @@ SOURCEFILES = \ src/player/angle.c \ src/player/player.c \ src/player/move.c \ + src/player/move_step.c \ src/raycast/ray.c \ src/raycast/walls.c \ src/renderer/render.c \ diff --git a/src/consts.h b/src/consts.h index 8dbda9c..2e87250 100644 --- a/src/consts.h +++ b/src/consts.h @@ -6,7 +6,7 @@ /* By: kcolin +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/07/17 14:54:36 by kcolin #+# #+# */ -/* Updated: 2025/08/08 12:08:23 by tchampio ### ########.fr */ +/* Updated: 2025/08/07 13:45:34 by kcolin ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,6 +21,7 @@ # define PLAYER_SIZE 6 # define RESSOURCE_DIR "ressources" # define MOVEMENT_SPEED 0.000005 +# define MOVEMENT_STEP 0.1 # define ROTATION_SPEED 0.000002 # define PLANE_VALUE 0.6 # define TEXTURE_SIZE 64 diff --git a/src/player/move.c b/src/player/move.c index cb9afee..b57c829 100644 --- a/src/player/move.c +++ b/src/player/move.c @@ -6,7 +6,7 @@ /* By: kcolin +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/08/05 12:53:06 by kcolin #+# #+# */ -/* Updated: 2025/08/06 11:46:04 by kcolin ### ########.fr */ +/* Updated: 2025/08/12 12:16:51 by kcolin ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,73 +14,71 @@ #include "angle.h" #include "../consts.h" #include "../map/collision.h" +#include +#include "move_step.h" void move_player_forward(t_cub3d_data *data) { - t_mapdata *map; - double next_x; - double next_y; - float movspeed; + double mov_x; + double mov_y; - movspeed = MOVEMENT_SPEED * data->delta; - map = data->map; - next_x = data->player.x + data->player.dir_x * movspeed; - next_y = data->player.y + data->player.dir_y * movspeed; - if (!blocks_movement(map, (int)data->player.y, (int)next_x)) - data->player.x += data->player.dir_x * movspeed; - if (!blocks_movement(map, (int)next_y, (int)data->player.x)) - data->player.y += data->player.dir_y * movspeed; + mov_x = data->player.dir_x * MOVEMENT_SPEED * data->delta; + mov_y = data->player.dir_y * MOVEMENT_SPEED * data->delta; + while (move_forward_step(data, mov_x, mov_y)) + { + mov_x -= calc_step(mov_x); + mov_y -= calc_step(mov_y); + if (fabs(mov_x) < MOVEMENT_SPEED && fabs(mov_y) < MOVEMENT_SPEED) + break ; + } } void move_player_backward(t_cub3d_data *data) { - t_mapdata *map; - double next_x; - double next_y; - float movspeed; + double mov_x; + double mov_y; - movspeed = MOVEMENT_SPEED * data->delta; - map = data->map; - next_x = data->player.x - data->player.dir_x * movspeed; - next_y = data->player.y - data->player.dir_y * movspeed; - if (!blocks_movement(map, (int)data->player.y, (int)next_x)) - data->player.x -= data->player.dir_x * movspeed; - if (!blocks_movement(map, (int)next_y, (int)data->player.x)) - data->player.y -= data->player.dir_y * movspeed; + mov_x = data->player.dir_x * MOVEMENT_SPEED * data->delta; + mov_y = data->player.dir_y * MOVEMENT_SPEED * data->delta; + while (move_backward_step(data, mov_x, mov_y)) + { + mov_x -= calc_step(mov_x); + mov_y -= calc_step(mov_y); + if (fabs(mov_x) < MOVEMENT_SPEED && fabs(mov_y) < MOVEMENT_SPEED) + break ; + } } void move_player_strafe_left(t_cub3d_data *data) { - t_mapdata *map; - double next_x; - double next_y; - float movspeed; + double mov_x; + double mov_y; - movspeed = MOVEMENT_SPEED * data->delta; - map = data->map; - next_x = data->player.x - data->player.plane_x * movspeed; - next_y = data->player.y - data->player.plane_y * movspeed; - if (!blocks_movement(map, (int)data->player.y, (int)next_x)) - data->player.x -= data->player.plane_x * movspeed; - if (!blocks_movement(map, (int)next_y, (int)data->player.x)) - data->player.y -= data->player.plane_y * movspeed; + mov_x = data->player.plane_x * MOVEMENT_SPEED * data->delta; + mov_y = data->player.plane_y * MOVEMENT_SPEED * data->delta; + while (move_strafe_left_step(data, mov_x, mov_y)) + { + mov_x -= calc_step(mov_x); + mov_y -= calc_step(mov_y); + if (fabs(mov_x) < MOVEMENT_SPEED && fabs(mov_y) < MOVEMENT_SPEED) + break ; + } } void move_player_strafe_right(t_cub3d_data *data) { - t_mapdata *map; - double next_x; - double next_y; - float movspeed; + double mov_x; + double mov_y; - movspeed = MOVEMENT_SPEED * data->delta; - map = data->map; - next_x = data->player.x + data->player.plane_x * movspeed; - next_y = data->player.y + data->player.plane_y * movspeed; - if (!blocks_movement(map, (int)data->player.y, (int)next_x)) - data->player.x += data->player.plane_x * movspeed; - if (!blocks_movement(map, (int)next_y, (int)data->player.x)) - data->player.y += data->player.plane_y * movspeed; + mov_x = data->player.plane_x * MOVEMENT_SPEED * data->delta; + mov_y = data->player.plane_y * MOVEMENT_SPEED * data->delta; + while (move_strafe_right_step(data, mov_x, mov_y)) + { + mov_x -= calc_step(mov_x); + mov_y -= calc_step(mov_y); + if (fabs(mov_x) < MOVEMENT_SPEED && fabs(mov_y) < MOVEMENT_SPEED) + break ; + } } void move_player(t_cub3d_data *data) diff --git a/src/player/move.h b/src/player/move.h index 66ea016..e3d0346 100644 --- a/src/player/move.h +++ b/src/player/move.h @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* move.h :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: tchampio +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2025/07/29 13:58:49 by tchampio #+# #+# */ -/* Updated: 2025/07/29 20:13:08 by tchampio ### ########.fr */ +/* Created: 2025/08/08 14:06:56 by kcolin #+# #+# */ +/* Updated: 2025/08/08 14:08:28 by kcolin ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/src/player/move_step.c b/src/player/move_step.c new file mode 100644 index 0000000..4b847c0 --- /dev/null +++ b/src/player/move_step.c @@ -0,0 +1,130 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* move_step.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kcolin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/08/08 14:06:37 by kcolin #+# #+# */ +/* Updated: 2025/08/12 12:16:17 by kcolin ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "move_step.h" +#include +#include "../map/collision.h" + +double calc_step(double a) +{ + double ret; + + if (fabs(a) > MOVEMENT_STEP) + { + if (a > 0) + ret = MOVEMENT_STEP; + else + ret = -MOVEMENT_STEP; + } + else + ret = a; + return (ret); +} + +// return value: +// true: keep moving +// false: hit wall +bool move_forward_step(t_cub3d_data *data, double mov_x, double mov_y) +{ + int blocks; + double x_step; + double y_step; + + blocks = 2; + x_step = calc_step(mov_x); + y_step = calc_step(mov_y); + if (!blocks_movement(data->map, (int)data->player.y, + (int)(data->player.x + x_step))) + { + data->player.x += x_step; + blocks--; + } + if (!blocks_movement(data->map, + (int)(data->player.y + y_step), (int)data->player.x)) + { + data->player.y += y_step; + blocks--; + } + return (blocks < 2); +} + +bool move_backward_step(t_cub3d_data *data, double mov_x, double mov_y) +{ + int blocks; + double x_step; + double y_step; + + blocks = 2; + x_step = calc_step(mov_x); + y_step = calc_step(mov_y); + if (!blocks_movement(data->map, (int)data->player.y, + (int)(data->player.x - x_step))) + { + data->player.x -= x_step; + blocks--; + } + if (!blocks_movement(data->map, + (int)(data->player.y - y_step), (int)data->player.x)) + { + data->player.y -= y_step; + blocks--; + } + return (blocks < 2); +} + +bool move_strafe_left_step(t_cub3d_data *data, double mov_x, double mov_y) +{ + int blocks; + double x_step; + double y_step; + + blocks = 2; + x_step = calc_step(mov_x); + y_step = calc_step(mov_y); + if (!blocks_movement(data->map, (int)data->player.y, + (int)(data->player.x - x_step))) + { + data->player.x -= x_step; + blocks--; + } + if (!blocks_movement(data->map, + (int)(data->player.y - y_step), (int)data->player.x)) + { + data->player.y -= y_step; + blocks--; + } + return (blocks < 2); +} + +bool move_strafe_right_step(t_cub3d_data *data, double mov_x, double mov_y) +{ + int blocks; + double x_step; + double y_step; + + blocks = 2; + x_step = calc_step(mov_x); + y_step = calc_step(mov_y); + if (!blocks_movement(data->map, (int)data->player.y, + (int)(data->player.x + x_step))) + { + data->player.x += x_step; + blocks--; + } + if (!blocks_movement(data->map, + (int)(data->player.y + y_step), (int)data->player.x)) + { + data->player.y += y_step; + blocks--; + } + return (blocks < 2); +} diff --git a/src/player/move_step.h b/src/player/move_step.h new file mode 100644 index 0000000..b5609ae --- /dev/null +++ b/src/player/move_step.h @@ -0,0 +1,25 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* move_step.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kcolin +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/08/08 14:06:22 by kcolin #+# #+# */ +/* Updated: 2025/08/12 12:16:20 by kcolin ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef MOVE_STEP_H +# define MOVE_STEP_H + +# include "../cub3d_data.h" + +double calc_step(double a); + +bool move_forward_step(t_cub3d_data *data, double mov_x, double mov_y); +bool move_backward_step(t_cub3d_data *data, double mov_x, double mov_y); +bool move_strafe_left_step(t_cub3d_data *data, double mov_x, double mov_y); +bool move_strafe_right_step(t_cub3d_data *data, double mov_x, double mov_y); + +#endif // MOVE_STEP_H From fcb08f6447bae21945f40deed37e264b55ddc98f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kha=C3=AFs=20COLIN?= Date: Tue, 12 Aug 2025 12:21:56 +0200 Subject: [PATCH 2/2] fix: various rendering issues - Correct rendering on whole window if window is not square - Multiple crashes eliminated - Sprites no longer lag behind player movement/rotation --- src/consts.h | 4 ++-- src/draw/drawutils.c | 4 ++-- src/main.c | 6 ++---- src/renderer/render.c | 6 +++--- 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/consts.h b/src/consts.h index 2e87250..a15c03e 100644 --- a/src/consts.h +++ b/src/consts.h @@ -6,15 +6,15 @@ /* By: kcolin +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/07/17 14:54:36 by kcolin #+# #+# */ -/* Updated: 2025/08/07 13:45:34 by kcolin ### ########.fr */ +/* Updated: 2025/08/12 14:32:47 by kcolin ### ########.fr */ /* */ /* ************************************************************************** */ #ifndef CONSTS_H # define CONSTS_H -# define HEIGHT 800 # define WIDTH 800 +# define HEIGHT 600 # define SIZE 64 # define MAP_SIZE 10 diff --git a/src/draw/drawutils.c b/src/draw/drawutils.c index 145cdc1..7948d9d 100644 --- a/src/draw/drawutils.c +++ b/src/draw/drawutils.c @@ -6,7 +6,7 @@ /* By: kcolin +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/07/17 14:28:56 by kcolin #+# #+# */ -/* Updated: 2025/08/06 14:02:08 by tchampio ### ########.fr */ +/* Updated: 2025/08/12 14:30:49 by kcolin ### ########.fr */ /* */ /* ************************************************************************** */ @@ -25,7 +25,7 @@ void my_mlx_pixel_put(t_img_data *data, int x, int y, int color) { char *dst; - if (x < 0 || y < 0 || x >= HEIGHT || y >= WIDTH) + if (x < 0 || y < 0 || x >= WIDTH || y >= HEIGHT) return ; dst = data->addr + (y * data->line_length + x * (data->bits_per_pixel / 8)); *(unsigned int *)dst = color; diff --git a/src/main.c b/src/main.c index 07ee598..7c57d95 100644 --- a/src/main.c +++ b/src/main.c @@ -6,7 +6,7 @@ /* By: kcolin +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/07/17 14:14:30 by kcolin #+# #+# */ -/* Updated: 2025/08/11 11:03:22 by tchampio ### ########.fr */ +/* Updated: 2025/08/12 14:23:27 by kcolin ### ########.fr */ /* */ /* ************************************************************************** */ @@ -39,11 +39,9 @@ int game_loop(t_cub3d_data *data) char *fps_string; data->last_tick = get_milliseconds(); - mlx_destroy_image(data->mlx, data->img_data->img); - data->img_data->img = mlx_new_image(data->mlx, WIDTH, HEIGHT); reset_matrix(data); - raycaster(data, &ray); move_player(data); + raycaster(data, &ray); sprite_caster(data); matrix_to_image(data); draw_map(data->map, &data->player, data->img_data); diff --git a/src/renderer/render.c b/src/renderer/render.c index e73c6b1..37e4011 100644 --- a/src/renderer/render.c +++ b/src/renderer/render.c @@ -6,7 +6,7 @@ /* By: kcolin +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/07/31 13:18:17 by kcolin #+# #+# */ -/* Updated: 2025/07/31 13:38:49 by kcolin ### ########.fr */ +/* Updated: 2025/08/12 14:31:04 by kcolin ### ########.fr */ /* */ /* ************************************************************************** */ @@ -23,12 +23,12 @@ void reset_matrix(t_cub3d_data *data) int matrix_get(t_cub3d_data *data, int x, int y) { - return (data->screen_matrix[y + x * WIDTH]); + return (data->screen_matrix[y + x * HEIGHT]); } void matrix_set(t_cub3d_data *data, int x, int y, int color) { - data->screen_matrix[y + x * WIDTH] = color; + data->screen_matrix[y + x * HEIGHT] = color; } void matrix_to_image(t_cub3d_data *data)