fix: prevent moving through walls in extreme lag situations

This commit is contained in:
Khaïs COLIN 2025-08-07 13:45:34 +02:00
parent b9b164e32d
commit 98e0119c91
Signed by: logistic-bot
SSH key fingerprint: SHA256:RlpiqKeXpcPFZZ4y9Ou4xi2M8OhRJovIwDlbCaMsuAo
7 changed files with 209 additions and 53 deletions

1
.gitignore vendored
View file

@ -4,3 +4,4 @@ cub3d
libft.a
vgcore.*
cscope.*
callgrind.out.*

View file

@ -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 \

View file

@ -6,7 +6,7 @@
/* By: kcolin <kcolin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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

View file

@ -6,7 +6,7 @@
/* By: kcolin <kcolin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 <math.h>
#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)

View file

@ -3,10 +3,10 @@
/* ::: :::::::: */
/* move.h :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: tchampio <tchampio@student.42lehavre. +#+ +:+ +#+ */
/* By: kcolin <kcolin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 */
/* */
/* ************************************************************************** */

130
src/player/move_step.c Normal file
View file

@ -0,0 +1,130 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* move_step.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: kcolin <kcolin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/08/08 14:06:37 by kcolin #+# #+# */
/* Updated: 2025/08/12 12:16:17 by kcolin ### ########.fr */
/* */
/* ************************************************************************** */
#include "move_step.h"
#include <math.h>
#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);
}

25
src/player/move_step.h Normal file
View file

@ -0,0 +1,25 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* move_step.h :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: kcolin <kcolin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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