diff --git a/algo.c b/algo.c index 9d32093..d3a3668 100644 --- a/algo.c +++ b/algo.c @@ -6,11 +6,12 @@ /* By: mcolonna +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/01 16:24:58 by grobledo #+# #+# */ -/* Updated: 2024/10/17 12:10:07 by mcolonna ### ########.fr */ +/* Updated: 2024/10/17 15:00:28 by mcolonna ### ########.fr */ /* */ /* ************************************************************************** */ #include "algo.h" +#include "input.h" void *g_mlx = NULL; void *g_win = NULL; @@ -54,9 +55,28 @@ void load_textures(t_tex *tex) &width, &height); } +static void loop(void) +{ + move(); + if (g_input_actions.quit) + { + mlx_destroy_window(g_mlx, g_win); + exit(0); + } + draw_screen(); +} + +static int loop_hook(void *param) +{ + (void)param; + timedloop(loop); + return (0); +} + int main(int argc, char *argv[]) { g_mlx = mlx_init(); + input_init(); if (argc != 2) { printf("Syntax: %s \n", argv[0]); @@ -66,6 +86,8 @@ int main(int argc, char *argv[]) return (1); g_win = mlx_new_window(g_mlx, SCREEN_WIDTH, SCREEN_HEIGHT, "cub3d"); mlx_hook(g_win, KeyPress, KeyPressMask, keypress, NULL); + mlx_hook(g_win, KeyRelease, KeyReleaseMask, keyrelease, NULL); + mlx_loop_hook(g_mlx, loop_hook, NULL); draw_screen(); mlx_loop(g_mlx); return (0); diff --git a/algo.h b/algo.h index cec8e7b..fcff0de 100644 --- a/algo.h +++ b/algo.h @@ -6,7 +6,7 @@ /* By: mcolonna +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/30 15:45:59 by grobledo #+# #+# */ -/* Updated: 2024/10/17 14:19:12 by mcolonna ### ########.fr */ +/* Updated: 2024/10/17 15:07:14 by mcolonna ### ########.fr */ /* */ /* ************************************************************************** */ @@ -30,9 +30,9 @@ # define MAP_HEIGHT 24 // cases (TODO test) # define TEX_WIDTH 64 # define TEX_HEIGHT 64 -# define MOVE_SPEED 0.1 // cases +# define MOVE_SPEED 0.05 // cases # define PI 3.1415926535 -# define ROT_SPEED_DIVIDE_PI 16 // pi/n rad +# define ROT_SPEED_DIVIDE_PI 64 // pi/n rad # define COLOR_WALL 0xFF0000 // 0xRRGGBB # define COLOR_CEILING 0x29f8ff // 0xRRGGBB # define COLOR_FLOOR 0xFF985C // 0xRRGGBB @@ -63,10 +63,10 @@ void write_err(const char *str, ...); void vector_from_rotation(t_point_double *vec, double angle, double norm); -int keypress(int keycode); - int render(u_int32_t *img_data); void draw_screen(void); +void move(void); + #endif diff --git a/input.c b/input.c new file mode 100644 index 0000000..b336d91 --- /dev/null +++ b/input.c @@ -0,0 +1,52 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* input.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: mcolonna +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/17 14:43:36 by mcolonna #+# #+# */ +/* Updated: 2024/10/17 15:00:54 by mcolonna ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "input.h" +#include +#include "algo.h" + +t_input_actions g_input_actions; + +static void set_action(int keycode, bool value) +{ + if (keycode == XK_Up || keycode == XK_z || keycode == XK_w) + g_input_actions.up = value; + if (keycode == XK_Down || keycode == XK_s) + g_input_actions.down = value; + if (keycode == XK_Right || keycode == XK_d) + g_input_actions.right = value; + if (keycode == XK_Left || keycode == XK_q || keycode == XK_a) + g_input_actions.left = value; + if (keycode == XK_Escape) + g_input_actions.quit = value; +} + +int keypress(int keycode) +{ + set_action(keycode, true); + return (0); +} + +int keyrelease(int keycode) +{ + set_action(keycode, false); + return (0); +} + +void input_init(void) +{ + g_input_actions.down = false; + g_input_actions.up = false; + g_input_actions.left = false; + g_input_actions.right = false; + g_input_actions.quit = false; +} diff --git a/input.h b/input.h new file mode 100644 index 0000000..becd5a1 --- /dev/null +++ b/input.h @@ -0,0 +1,35 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* input.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: mcolonna +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/10/17 14:43:09 by mcolonna #+# #+# */ +/* Updated: 2024/10/17 14:59:41 by mcolonna ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef INPUT_H +# define INPUT_H + +# include + +/// @brief Modified by the input of the user. A value becomes true +/// when the user presses the corresponding key. +typedef struct s_input_actions +{ + bool left; + bool right; + bool up; + bool down; + bool quit; +} t_input_actions; + +extern t_input_actions g_input_actions; + +int keypress(int keycode); +int keyrelease(int keycode); +void input_init(void); + +#endif diff --git a/move.c b/move.c index 405faaf..8511c2f 100644 --- a/move.c +++ b/move.c @@ -6,11 +6,12 @@ /* By: mcolonna +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/15 12:47:34 by mcolonna #+# #+# */ -/* Updated: 2024/10/17 14:20:10 by mcolonna ### ########.fr */ +/* Updated: 2024/10/17 15:06:43 by mcolonna ### ########.fr */ /* */ /* ************************************************************************** */ #include "algo.h" +#include "input.h" static void push_from_wall(t_point_int c) { @@ -47,7 +48,7 @@ static void push_from_walls(void) push_from_wall(c); } -static int move(int factor) +static int move_forward(int factor) { t_point_double dir; @@ -55,7 +56,6 @@ static int move(int factor) g_map.player.pos.x += dir.x * MOVE_SPEED * factor; g_map.player.pos.y += dir.y * MOVE_SPEED * factor; push_from_walls(); - printf("%f %f\n", g_map.player.pos.x, g_map.player.pos.y); return (0); } @@ -67,21 +67,14 @@ static int rotate(int factor) // TODO leaks when quit? -int keypress(int keycode) +void move(void) { - if (keycode == XK_Up || keycode == XK_z || keycode == XK_w) - move(+1); - if (keycode == XK_Down || keycode == XK_s) - move(-1); - if (keycode == XK_Right || keycode == XK_d) + if (g_input_actions.up && !g_input_actions.down) + move_forward(+1); + if (g_input_actions.down && !g_input_actions.up) + move_forward(-1); + if (g_input_actions.right && !g_input_actions.left) rotate(+1); - if (keycode == XK_Left || keycode == XK_q || keycode == XK_a) + if (g_input_actions.left && !g_input_actions.right) rotate(-1); - if (keycode == XK_Escape) - { - mlx_destroy_window(g_mlx, g_win); - exit(0); - } - draw_screen(); - return (0); } diff --git a/utils.c b/utils.c index 48e0c16..6e8a570 100644 --- a/utils.c +++ b/utils.c @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* utils.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: mcolonna +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/15 12:38:40 by mcolonna #+# #+# */ -/* Updated: 2024/10/16 18:01:25 by mcolonna ### ########.fr */ +/* Updated: 2024/10/17 15:05:15 by mcolonna ### ########.fr */ /* */ /* ************************************************************************** */ @@ -31,3 +31,41 @@ void write_err(const char *str, ...) str = va_arg(args, const char *); } } + +/* FOR BONUS +static long get_nanos(void) +{ + struct timespec ts; + + timespec_get(&ts, TIME_UTC); + return ((long)ts.tv_sec * 1000000000L + ts.tv_nsec); +} + +void timedloop(void (*f)(void)) +{ + static long last_time = 0; + const long new_time = get_nanos(); + static bool checked = false; + + if (new_time - last_time >= 1000000000L / FPS) + { + if (checked) + last_time += 1000000000L / FPS; + else + last_time = new_time; + checked = false; + f(); + } + else + checked = true; +} +*/ + +void timedloop(void (*f)(void)) +{ + static int ticks; + + if (ticks % 100 == 0) + f(); + ticks++; +} diff --git a/utils.h b/utils.h index ccca448..93a619d 100644 --- a/utils.h +++ b/utils.h @@ -6,7 +6,7 @@ /* By: mcolonna +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/15 16:56:47 by mcolonna #+# #+# */ -/* Updated: 2024/10/15 17:21:10 by mcolonna ### ########.fr */ +/* Updated: 2024/10/17 14:41:09 by mcolonna ### ########.fr */ /* */ /* ************************************************************************** */ @@ -41,4 +41,11 @@ t_color color_from_rgb(int red, int green, int blue); void write_err(const char *str, ...); +/// @brief Call the function in loop. +/// If not enough time passed since the last call, returns without doing +/// anything. +/// +/// @param f Function to call in loop. +void timedloop(void (*f)(void)); + #endif