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