diff --git a/.vscode/settings.json b/.vscode/settings.json index cb9e377..8229571 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -15,7 +15,10 @@ "game_menu.h": "c", "game_manager.h": "c", "collision.h": "c", - "monster.h": "c" + "monster.h": "c", + "shaders.h": "c", + "hooks.h": "c", + "player.h": "c" }, "cmake.ignoreCMakeListsMissing": true } \ No newline at end of file diff --git a/inc/cub3d.h b/inc/cub3d.h index 7e0e3bd..1cf0967 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/06/11 20:32:00 by qmennen ### ########.fr */ +/* Updated: 2025/06/12 13:29:23 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -77,11 +77,9 @@ # include "game_manager.h" # include "game_menu.h" # include "monster.h" +# include "shaders.h" int initialize_cub3d(t_game **game, const char *mapfile); -int shader_init(void); -void set_uniforms(t_game *game); -int load_uniforms(t_game **game); void count_scores(t_game *game); int count_tiles(t_map *map, t_tile tile_type); diff --git a/inc/game.h b/inc/game.h index d05d24f..1dcea78 100644 --- a/inc/game.h +++ b/inc/game.h @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/15 15:46:16 by qmennen #+# #+# */ -/* Updated: 2025/06/03 15:54:12 by qmennen ### ########.fr */ +/* Updated: 2025/06/12 14:01:38 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,8 +22,9 @@ void game_terminate(t_game *game); void free_game(t_game **game); void print_scores(t_game *game); void game_run(t_game *game); -void handle_battery(t_game *game); -void handle_record(t_game *game); +void hud_update_battery(t_game *game); +void hud_draw_record(t_game *game); void handle_flash(t_sprite *sprite, t_game *game); +void hud_draw_battery(mlx_image_t *img, float battery); #endif diff --git a/inc/game_manager.h b/inc/game_manager.h index 0372617..0f6c55d 100644 --- a/inc/game_manager.h +++ b/inc/game_manager.h @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/27 13:40:20 by qmennen #+# #+# */ -/* Updated: 2025/06/11 15:00:14 by qmennen ### ########.fr */ +/* Updated: 2025/06/12 14:08:47 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,8 +18,7 @@ t_game_manager *game_manager_create(t_game *game, int state); void game_manager_display(t_game_manager *manager); void game_manager_update(void *param); -void game_manager_select(t_game_manager *manager); -void game_manager_handle_input(t_game_manager *manager); void game_manager_destroy(void *param); +void game_manager_handle_input(t_game_manager *manager); #endif \ No newline at end of file diff --git a/inc/game_menu.h b/inc/game_menu.h index cf49288..8e68770 100644 --- a/inc/game_menu.h +++ b/inc/game_menu.h @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* game_menu.h :+: :+: */ -/* +:+ */ -/* By: qmennen +#+ */ -/* +#+ */ -/* Created: 2025/05/27 15:07:48 by qmennen #+# #+# */ -/* Updated: 2025/06/10 19:30:12 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* game_menu.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/05/27 15:07:48 by qmennen #+# #+# */ +/* Updated: 2025/06/12 14:13:33 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,9 +17,8 @@ void menu_display(t_menu *menu, t_screen *screen); void draw_end_screen(t_game_manager *manager, t_menu *menu); -t_menu *create_end_screen(t_game_manager *manager); -mlx_image_t *menu_load_background(mlx_t *mlx, char *background_path); void menu_set_background(t_menu *menu, mlx_t *mlx, char *b_path); +t_menu *create_end_screen(t_game_manager *manager); t_menu *create_main_menu(t_game_manager *manager); t_menu *menu_create(t_game_manager *manager, char *b_path, const t_menu_item *options[]); diff --git a/inc/hooks.h b/inc/hooks.h index 27ab2ef..7c69b83 100644 --- a/inc/hooks.h +++ b/inc/hooks.h @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* hooks.h :+: :+: */ -/* +:+ */ -/* By: qmennen +#+ */ -/* +#+ */ -/* Created: 2025/04/15 17:51:44 by qmennen #+# #+# */ -/* Updated: 2025/06/04 16:42:43 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* hooks.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/04/15 17:51:44 by qmennen #+# #+# */ +/* Updated: 2025/06/12 13:45:28 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,7 +15,7 @@ # include "cub3d.h" -void keyhandle(mlx_key_data_t keydata, void *param); +void hook_keyboard(mlx_key_data_t keydata, void *param); void handle_mouse(t_game *game); #endif diff --git a/inc/monster.h b/inc/monster.h index c6eeeb4..f654019 100644 --- a/inc/monster.h +++ b/inc/monster.h @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/28 17:16:29 by qmennen #+# #+# */ -/* Updated: 2025/05/28 17:16:43 by qmennen ### ########.fr */ +/* Updated: 2025/06/12 14:14:52 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,6 +15,6 @@ # include "cub3d.h" -void update_monsters(t_game *game); +void monster_update(t_game *game); #endif \ No newline at end of file diff --git a/inc/player.h b/inc/player.h index 557cd7c..3995a41 100644 --- a/inc/player.h +++ b/inc/player.h @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* player.h :+: :+: */ -/* +:+ */ -/* By: qmennen +#+ */ -/* +#+ */ -/* Created: 2025/04/15 18:53:27 by qmennen #+# #+# */ -/* Updated: 2025/06/10 19:29:24 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* player.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/04/15 18:53:27 by qmennen #+# #+# */ +/* Updated: 2025/06/12 14:01:23 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,8 +17,9 @@ int player_create(t_game **game); void player_update(t_game *game, double delta_time); -void visit_area(t_game *game); -void rotate(t_player *player, double rot_speed, double delta); +void player_move(t_map *map, t_player *player, int dir, double delta); +void player_rotate(t_player *player, double rot_speed, double delta); +void player_strafe(t_map *map, t_player *player, int dir, double delta); void interact_door(t_game *game); #endif diff --git a/inc/screen.h b/inc/screen.h index 4b18818..2081c28 100644 --- a/inc/screen.h +++ b/inc/screen.h @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/15 15:30:34 by qmennen #+# #+# */ -/* Updated: 2025/06/03 19:44:17 by qmennen ### ########.fr */ +/* Updated: 2025/06/12 13:24:29 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,5 +18,6 @@ int screen_create(t_game **game); int screen_display(t_screen *screen); void fill_background(mlx_image_t *image, int color); +int screen_center(t_screen *screen); #endif diff --git a/inc/shaders.h b/inc/shaders.h new file mode 100644 index 0000000..bdc57f1 --- /dev/null +++ b/inc/shaders.h @@ -0,0 +1,25 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* shaders.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/06/12 13:28:42 by qmennen #+# #+# */ +/* Updated: 2025/06/12 13:40:35 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef SHADERS_H +# define SHADERS_H + +# include "cub3d.h" +# include "glad.h" +# include "MLX42_Int.h" + +int shader_init(void); +int shader_load_uniforms(t_game **game); +void shader_set_uniforms(t_game *game); +const char *shader_read_glsl(const char *target); + +#endif \ No newline at end of file diff --git a/inc/texture.h b/inc/texture.h index b30eb6a..d37f2cb 100644 --- a/inc/texture.h +++ b/inc/texture.h @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/06 15:46:20 by qmennen #+# #+# */ -/* Updated: 2025/05/06 15:59:52 by qmennen ### ########.fr */ +/* Updated: 2025/06/12 13:43:38 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,6 +15,7 @@ # include "cub3d.h" -int texture_load(t_game *game); +int texture_load(t_game *game); +void texture_delete(t_game *game); #endif \ No newline at end of file diff --git a/src/engine/hooks/hook_keyboard.c b/src/engine/hooks/hook_keyboard.c new file mode 100644 index 0000000..bd77995 --- /dev/null +++ b/src/engine/hooks/hook_keyboard.c @@ -0,0 +1,22 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* hook_keyboard.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/06/12 13:44:48 by qmennen #+# #+# */ +/* Updated: 2025/06/12 13:46:46 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "hooks.h" + +void hook_keyboard(mlx_key_data_t keydata, void *param) +{ + t_game_manager *manager; + + manager = (t_game_manager *)param; + if (keydata.key == MLX_KEY_ESCAPE) + game_manager_destroy(manager); +} diff --git a/src/util/hooks.c b/src/engine/hooks/hook_mouse.c similarity index 68% rename from src/util/hooks.c rename to src/engine/hooks/hook_mouse.c index 5eb7fa8..f248270 100644 --- a/src/util/hooks.c +++ b/src/engine/hooks/hook_mouse.c @@ -1,26 +1,17 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* hooks.c :+: :+: :+: */ +/* hook_mouse.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2025/04/15 17:51:26 by qmennen #+# #+# */ -/* Updated: 2025/06/10 15:48:10 by qmennen ### ########.fr */ +/* Created: 2025/06/12 13:45:46 by qmennen #+# #+# */ +/* Updated: 2025/06/12 16:06:12 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ #include "hooks.h" -void keyhandle(mlx_key_data_t keydata, void *param) -{ - t_game_manager *manager; - - manager = (t_game_manager *)param; - if (keydata.key == MLX_KEY_ESCAPE) - game_manager_destroy(manager); -} - void handle_mouse(t_game *game) { t_vec2_int mouse_pos; @@ -29,6 +20,7 @@ void handle_mouse(t_game *game) mlx = game->screen->mlx; mlx_set_cursor_mode(mlx, MLX_MOUSE_HIDDEN); mlx_get_mouse_pos(mlx, &mouse_pos.x, &mouse_pos.y); - rotate(game->player, 0.1 * (mouse_pos.x - mlx->width / 2), mlx->delta_time); + player_rotate(game->player, 0.1 * (mouse_pos.x - mlx->width / 2), + mlx->delta_time); mlx_set_mouse_pos(mlx, mlx->width / 2, mlx->height / 2); } diff --git a/src/math/add.c b/src/engine/math/add.c similarity index 100% rename from src/math/add.c rename to src/engine/math/add.c diff --git a/src/math/dist.c b/src/engine/math/dist.c similarity index 100% rename from src/math/dist.c rename to src/engine/math/dist.c diff --git a/src/math/dist_point_line.c b/src/engine/math/dist_point_line.c similarity index 100% rename from src/math/dist_point_line.c rename to src/engine/math/dist_point_line.c diff --git a/src/math/dot.c b/src/engine/math/dot.c similarity index 100% rename from src/math/dot.c rename to src/engine/math/dot.c diff --git a/src/math/get_fraction.c b/src/engine/math/get_fraction.c similarity index 100% rename from src/math/get_fraction.c rename to src/engine/math/get_fraction.c diff --git a/src/math/mul.c b/src/engine/math/mul.c similarity index 100% rename from src/math/mul.c rename to src/engine/math/mul.c diff --git a/src/math/norm.c b/src/engine/math/norm.c similarity index 100% rename from src/math/norm.c rename to src/engine/math/norm.c diff --git a/src/math/perp.c b/src/engine/math/perp.c similarity index 100% rename from src/math/perp.c rename to src/engine/math/perp.c diff --git a/src/math/rot.c b/src/engine/math/rot.c similarity index 100% rename from src/math/rot.c rename to src/engine/math/rot.c diff --git a/src/math/rot_by_dir.c b/src/engine/math/rot_by_dir.c similarity index 100% rename from src/math/rot_by_dir.c rename to src/engine/math/rot_by_dir.c diff --git a/src/math/sub.c b/src/engine/math/sub.c similarity index 100% rename from src/math/sub.c rename to src/engine/math/sub.c diff --git a/src/math/vec2_from_int.c b/src/engine/math/vec2_from_int.c similarity index 100% rename from src/math/vec2_from_int.c rename to src/engine/math/vec2_from_int.c diff --git a/src/math/vec2_to_int.c b/src/engine/math/vec2_to_int.c similarity index 100% rename from src/math/vec2_to_int.c rename to src/engine/math/vec2_to_int.c diff --git a/src/parser/copy_map.c b/src/engine/parser/copy_map.c similarity index 100% rename from src/parser/copy_map.c rename to src/engine/parser/copy_map.c diff --git a/src/parser/count_chars.c b/src/engine/parser/count_chars.c similarity index 100% rename from src/parser/count_chars.c rename to src/engine/parser/count_chars.c diff --git a/src/parser/create_grid.c b/src/engine/parser/create_grid.c similarity index 100% rename from src/parser/create_grid.c rename to src/engine/parser/create_grid.c diff --git a/src/parser/enclosed_map.c b/src/engine/parser/enclosed_map.c similarity index 100% rename from src/parser/enclosed_map.c rename to src/engine/parser/enclosed_map.c diff --git a/src/parser/find_player_or_empty.c b/src/engine/parser/find_player_or_empty.c similarity index 100% rename from src/parser/find_player_or_empty.c rename to src/engine/parser/find_player_or_empty.c diff --git a/src/parser/floodfill.c b/src/engine/parser/floodfill.c similarity index 100% rename from src/parser/floodfill.c rename to src/engine/parser/floodfill.c diff --git a/src/parser/get_file_size.c b/src/engine/parser/get_file_size.c similarity index 100% rename from src/parser/get_file_size.c rename to src/engine/parser/get_file_size.c diff --git a/src/parser/get_tile.c b/src/engine/parser/get_tile.c similarity index 100% rename from src/parser/get_tile.c rename to src/engine/parser/get_tile.c diff --git a/src/parser/grid_free.c b/src/engine/parser/grid_free.c similarity index 100% rename from src/parser/grid_free.c rename to src/engine/parser/grid_free.c diff --git a/src/parser/is_map_line.c b/src/engine/parser/is_map_line.c similarity index 100% rename from src/parser/is_map_line.c rename to src/engine/parser/is_map_line.c diff --git a/src/parser/map_create.c b/src/engine/parser/map_create.c similarity index 100% rename from src/parser/map_create.c rename to src/engine/parser/map_create.c diff --git a/src/parser/map_entries_present.c b/src/engine/parser/map_entries_present.c similarity index 100% rename from src/parser/map_entries_present.c rename to src/engine/parser/map_entries_present.c diff --git a/src/parser/map_free.c b/src/engine/parser/map_free.c similarity index 100% rename from src/parser/map_free.c rename to src/engine/parser/map_free.c diff --git a/src/parser/map_width.c b/src/engine/parser/map_width.c similarity index 100% rename from src/parser/map_width.c rename to src/engine/parser/map_width.c diff --git a/src/parser/parse_args.c b/src/engine/parser/parse_args.c similarity index 100% rename from src/parser/parse_args.c rename to src/engine/parser/parse_args.c diff --git a/src/parser/parse_color.c b/src/engine/parser/parse_color.c similarity index 100% rename from src/parser/parse_color.c rename to src/engine/parser/parse_color.c diff --git a/src/parser/parse_config_line.c b/src/engine/parser/parse_config_line.c similarity index 100% rename from src/parser/parse_config_line.c rename to src/engine/parser/parse_config_line.c diff --git a/src/parser/parse_file.c b/src/engine/parser/parse_file.c similarity index 100% rename from src/parser/parse_file.c rename to src/engine/parser/parse_file.c diff --git a/src/parser/parse_handlers.c b/src/engine/parser/parse_handlers.c similarity index 100% rename from src/parser/parse_handlers.c rename to src/engine/parser/parse_handlers.c diff --git a/src/parser/parse_map.c b/src/engine/parser/parse_map.c similarity index 100% rename from src/parser/parse_map.c rename to src/engine/parser/parse_map.c diff --git a/src/parser/parse_map_sprites.c b/src/engine/parser/parse_map_sprites.c similarity index 100% rename from src/parser/parse_map_sprites.c rename to src/engine/parser/parse_map_sprites.c diff --git a/src/parser/parse_tile.c b/src/engine/parser/parse_tile.c similarity index 100% rename from src/parser/parse_tile.c rename to src/engine/parser/parse_tile.c diff --git a/src/parser/pointer_lines.c b/src/engine/parser/pointer_lines.c similarity index 100% rename from src/parser/pointer_lines.c rename to src/engine/parser/pointer_lines.c diff --git a/src/parser/print_config.c b/src/engine/parser/print_config.c similarity index 100% rename from src/parser/print_config.c rename to src/engine/parser/print_config.c diff --git a/src/parser/print_map.c b/src/engine/parser/print_map.c similarity index 100% rename from src/parser/print_map.c rename to src/engine/parser/print_map.c diff --git a/src/parser/read_map_file.c b/src/engine/parser/read_map_file.c similarity index 100% rename from src/parser/read_map_file.c rename to src/engine/parser/read_map_file.c diff --git a/src/parser/valid_arguments.c b/src/engine/parser/valid_arguments.c similarity index 100% rename from src/parser/valid_arguments.c rename to src/engine/parser/valid_arguments.c diff --git a/src/render/dda.c b/src/engine/render/dda.c similarity index 100% rename from src/render/dda.c rename to src/engine/render/dda.c diff --git a/src/render/render.c b/src/engine/render/render.c similarity index 100% rename from src/render/render.c rename to src/engine/render/render.c diff --git a/src/render/render_circle.c b/src/engine/render/render_circle.c similarity index 100% rename from src/render/render_circle.c rename to src/engine/render/render_circle.c diff --git a/src/render/render_floor.c b/src/engine/render/render_floor.c similarity index 100% rename from src/render/render_floor.c rename to src/engine/render/render_floor.c diff --git a/src/render/render_minimap.c b/src/engine/render/render_minimap.c similarity index 100% rename from src/render/render_minimap.c rename to src/engine/render/render_minimap.c diff --git a/src/render/render_sprite.c b/src/engine/render/render_sprite.c similarity index 100% rename from src/render/render_sprite.c rename to src/engine/render/render_sprite.c diff --git a/src/render/render_sprite_utils.c b/src/engine/render/render_sprite_utils.c similarity index 100% rename from src/render/render_sprite_utils.c rename to src/engine/render/render_sprite_utils.c diff --git a/src/render/render_walls.c b/src/engine/render/render_walls.c similarity index 100% rename from src/render/render_walls.c rename to src/engine/render/render_walls.c diff --git a/src/engine/screen/screen_center.c b/src/engine/screen/screen_center.c new file mode 100644 index 0000000..53e4c76 --- /dev/null +++ b/src/engine/screen/screen_center.c @@ -0,0 +1,28 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* screen_center.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/06/12 13:23:39 by qmennen #+# #+# */ +/* Updated: 2025/06/12 13:32:59 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "screen.h" + +int screen_center(t_screen *screen) +{ + int m_width; + int m_height; + + m_width = 0; + m_height = 0; + mlx_get_monitor_size(0, &m_width, &m_height); + if (m_width == 0 || m_height == 0) + return (FAILURE); + mlx_set_window_pos(screen->mlx, (m_width - screen->width) / 2, + (m_height - screen->height) / 2); + return (SUCCESS); +} diff --git a/src/screen.c b/src/engine/screen/screen_create.c similarity index 54% rename from src/screen.c rename to src/engine/screen/screen_create.c index a377453..1bca388 100644 --- a/src/screen.c +++ b/src/engine/screen/screen_create.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/15 15:30:27 by qmennen #+# #+# */ -/* Updated: 2025/06/10 14:41:07 by qmennen ### ########.fr */ +/* Updated: 2025/06/12 13:27:08 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -40,60 +40,3 @@ int screen_create(t_game **game) (*game)->screen = screen; return (SUCCESS); } - -void fill_background(mlx_image_t *image, int color) -{ - unsigned int i; - unsigned int j; - - i = 0; - while (i < image->width) - { - j = 0; - while (j < image->height) - { - mlx_put_pixel(image, i, j, color); - j++; - } - i++; - } -} - -int center_window(t_screen *screen) -{ - int m_width; - int m_height; - - m_width = 0; - m_height = 0; - mlx_get_monitor_size(0, &m_width, &m_height); - if (m_width == 0 || m_height == 0) - return (FAILURE); - mlx_set_window_pos(screen->mlx, (m_width - screen->width) / 2, - (m_height - screen->height) / 2); - return (SUCCESS); -} - -int screen_display(t_screen *screen) -{ - int display_error; - - fill_background(screen->background, 0x000000FF); - display_error = 0; - display_error |= mlx_image_to_window(screen->mlx, - screen->background, 0, 0) < 0; - display_error |= mlx_image_to_window(screen->mlx, - screen->img, 0, 0) < 0; - display_error |= mlx_image_to_window(screen->mlx, - screen->minimap, 175, 575) < 0; - display_error |= mlx_image_to_window(screen->mlx, - screen->hud, 0, 0) < 0; - if (display_error || !center_window(screen)) - { - printf(RED "Display failed to initialize\n" RESET); - return (FAILURE); - } - screen->hud->instances[0].enabled = false; - screen->minimap->instances[0].enabled = false; - return (SUCCESS); -} diff --git a/src/engine/screen/screen_display.c b/src/engine/screen/screen_display.c new file mode 100644 index 0000000..6f70ba4 --- /dev/null +++ b/src/engine/screen/screen_display.c @@ -0,0 +1,37 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* screen_display.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/06/12 13:25:50 by qmennen #+# #+# */ +/* Updated: 2025/06/12 13:33:46 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "screen.h" + +int screen_display(t_screen *screen) +{ + int display_error; + + fill_background(screen->background, 0x000000FF); + display_error = 0; + display_error |= mlx_image_to_window(screen->mlx, + screen->background, 0, 0) < 0; + display_error |= mlx_image_to_window(screen->mlx, + screen->img, 0, 0) < 0; + display_error |= mlx_image_to_window(screen->mlx, + screen->minimap, 175, 575) < 0; + display_error |= mlx_image_to_window(screen->mlx, + screen->hud, 0, 0) < 0; + if (display_error || !screen_center(screen)) + { + printf(RED "Display failed to initialize\n" RESET); + return (FAILURE); + } + screen->hud->instances[0].enabled = false; + screen->minimap->instances[0].enabled = false; + return (SUCCESS); +} diff --git a/src/engine/screen/screen_fill_background.c b/src/engine/screen/screen_fill_background.c new file mode 100644 index 0000000..3103e21 --- /dev/null +++ b/src/engine/screen/screen_fill_background.c @@ -0,0 +1,31 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* screen_fill_background.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/06/12 13:26:49 by qmennen #+# #+# */ +/* Updated: 2025/06/12 13:33:58 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "screen.h" + +void fill_background(mlx_image_t *image, int color) +{ + unsigned int i; + unsigned int j; + + i = 0; + while (i < image->width) + { + j = 0; + while (j < image->height) + { + mlx_put_pixel(image, i, j, color); + j++; + } + i++; + } +} diff --git a/src/engine/shader/shader_init.c b/src/engine/shader/shader_init.c new file mode 100644 index 0000000..4b668b9 --- /dev/null +++ b/src/engine/shader/shader_init.c @@ -0,0 +1,24 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* shader_init.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/05/08 18:27:59 by qmennen #+# #+# */ +/* Updated: 2025/06/12 13:42:50 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "cub3d.h" + +int shader_init(void) +{ + vert_shader = shader_read_glsl("./assets/shaders/vert.glsl"); + if (!vert_shader) + return (FAILURE); + frag_shader = shader_read_glsl("./assets/shaders/frag.glsl"); + if (!frag_shader) + return (FAILURE); + return (SUCCESS); +} diff --git a/src/engine/shader/shader_load_uniforms.c b/src/engine/shader/shader_load_uniforms.c new file mode 100644 index 0000000..7b12525 --- /dev/null +++ b/src/engine/shader/shader_load_uniforms.c @@ -0,0 +1,40 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* shader_load_uniforms.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/06/12 13:36:40 by qmennen #+# #+# */ +/* Updated: 2025/06/12 13:37:13 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "shaders.h" + +int shader_load_uniforms(t_game **game) +{ + mlx_ctx_t *ctx; + + ctx = (mlx_ctx_t *)(*game)->screen->mlx->context; + (*game)->screen->u_time_location = glGetUniformLocation( + ctx->shaderprogram, "u_time"); + (*game)->screen->u_battery_location = glGetUniformLocation( + ctx->shaderprogram, "u_battery"); + (*game)->screen->u_hit_timer_location = glGetUniformLocation( + ctx->shaderprogram, "u_hit_timer"); + (*game)->screen->u_enabled_location = glGetUniformLocation( + ctx->shaderprogram, "u_enabled"); + (*game)->screen->u_resolution_location = glGetUniformLocation( + ctx->shaderprogram, "u_resolution"); + (*game)->screen->u_ismoving_location = glGetUniformLocation( + ctx->shaderprogram, "u_ismoving"); + if ((*game)->screen->u_time_location < 0 + || (*game)->screen->u_battery_location < 0 + || (*game)->screen->u_hit_timer_location < 0 + || (*game)->screen->u_enabled_location < 0 + || (*game)->screen->u_resolution_location < 0 + || (*game)->screen->u_ismoving_location < 0) + return (FAILURE); + return (SUCCESS); +} diff --git a/src/engine/shader/shader_read_glsl.c b/src/engine/shader/shader_read_glsl.c new file mode 100644 index 0000000..9438850 --- /dev/null +++ b/src/engine/shader/shader_read_glsl.c @@ -0,0 +1,41 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* shader_read_glsl.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/06/12 13:38:37 by qmennen #+# #+# */ +/* Updated: 2025/06/12 13:42:43 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "shaders.h" + +const char *shader_read_glsl(const char *target) +{ + char *shader; + int fd; + int file_size; + ssize_t bytes_read; + + if (!target) + return (NULL); + file_size = get_file_size(target); + fd = open(target, O_RDONLY); + if (fd < 0) + return (perror("Error opening shader file"), NULL); + shader = malloc(file_size * sizeof(char) + 1); + if (!shader) + { + return (perror("Error allocating memory for shader"), close(fd), NULL); + } + bytes_read = read(fd, shader, file_size); + if (bytes_read < 0) + { + return (perror("Error reading shader file"), + free(shader), close(fd), NULL); + } + shader[bytes_read] = '\0'; + return (close(fd), shader); +} diff --git a/src/engine/shader/shader_set_uniforms.c b/src/engine/shader/shader_set_uniforms.c new file mode 100644 index 0000000..279548e --- /dev/null +++ b/src/engine/shader/shader_set_uniforms.c @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* shader_set_uniforms.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/06/12 13:30:25 by qmennen #+# #+# */ +/* Updated: 2025/06/12 13:31:57 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "shaders.h" + +void shader_set_uniforms(t_game *game) +{ + glUniform1f(game->screen->u_time_location, (float)mlx_get_time()); + glUniform1i(game->screen->u_ismoving_location, + game->player->is_moving); + glUniform1f(game->screen->u_battery_location, game->player->battery); + glUniform2f(game->screen->u_resolution_location, + (float)game->screen->width, (float)game->screen->height); + glUniform1f(game->screen->u_hit_timer_location, game->player->hit_timer); + glUniform1i(game->screen->u_enabled_location, + game->manager->state == GAME_STATE_PLAYING); +} diff --git a/src/engine/texture/texture_delete.c b/src/engine/texture/texture_delete.c new file mode 100644 index 0000000..6c6c3af --- /dev/null +++ b/src/engine/texture/texture_delete.c @@ -0,0 +1,36 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* texture_delete.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/06/12 13:43:20 by qmennen #+# #+# */ +/* Updated: 2025/06/12 13:43:52 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "texture.h" + +void texture_delete(t_game *game) +{ + int i; + + i = 0; + while (i < 4) + { + if (game->map->textures[i]) + mlx_delete_texture(game->map->textures[i]); + i++; + } + if (game->map->texture_floor) + { + mlx_delete_texture(game->map->texture_floor); + game->map->texture_floor = NULL; + } + if (game->map->texture_ceiling) + { + mlx_delete_texture(game->map->texture_ceiling); + game->map->texture_ceiling = NULL; + } +} diff --git a/src/engine/texture/texutre_load.c b/src/engine/texture/texutre_load.c new file mode 100644 index 0000000..ba4a745 --- /dev/null +++ b/src/engine/texture/texutre_load.c @@ -0,0 +1,24 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* texutre_load.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/05/06 15:45:58 by qmennen #+# #+# */ +/* Updated: 2025/06/12 13:43:15 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "texture.h" + +int texture_load(t_game *game) +{ + if (!game->map->textures[SIDE_NORTH] || !game->map->textures[SIDE_EAST] + || !game->map->textures[SIDE_SOUTH] || !game->map->textures[SIDE_WEST]) + { + texture_delete(game); + return (FAILURE); + } + return (SUCCESS); +} diff --git a/src/util/initialize.c b/src/engine/util/initialize.c similarity index 91% rename from src/util/initialize.c rename to src/engine/util/initialize.c index d0baa8a..4c64b03 100644 --- a/src/util/initialize.c +++ b/src/engine/util/initialize.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/22 17:08:26 by qmennen #+# #+# */ -/* Updated: 2025/06/10 14:42:24 by qmennen ### ########.fr */ +/* Updated: 2025/06/12 16:06:38 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,7 +14,7 @@ t_sprite make_sprite(t_sprite_lib *def, double x, double y) { - t_sprite sprite; + t_sprite sprite; ft_memset(&sprite, 0, sizeof(t_sprite)); sprite.texture = def->texture; @@ -28,11 +28,11 @@ t_sprite make_sprite(t_sprite_lib *def, double x, double y) static int init_temp(t_game **game) { - mlx_texture_t *hud_texture; + mlx_texture_t *hud_texture; hud_texture = mlx_load_png("./assets/hud/cam_overlay.png"); (*game)->screen->hud = mlx_texture_to_image((*game)->screen->mlx, - hud_texture); + hud_texture); mlx_delete_texture(hud_texture); return (SUCCESS); } @@ -51,7 +51,7 @@ int initialize_cub3d(t_game **game, const char *mapfile) return (FAILURE); if (!screen_create(game)) return (FAILURE); - if (!load_uniforms(game)) + if (!shader_load_uniforms(game)) return (FAILURE); if (!keyboard_create(game)) return (FAILURE); diff --git a/src/util/keyboard.c b/src/engine/util/keyboard.c similarity index 100% rename from src/util/keyboard.c rename to src/engine/util/keyboard.c diff --git a/src/util/score.c b/src/engine/util/score.c similarity index 100% rename from src/util/score.c rename to src/engine/util/score.c diff --git a/src/game/collision/collision_axis.c b/src/game/collision/collision_axis.c new file mode 100644 index 0000000..ab7a468 --- /dev/null +++ b/src/game/collision/collision_axis.c @@ -0,0 +1,29 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* collision_axis.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/06/12 13:47:35 by qmennen #+# #+# */ +/* Updated: 2025/06/12 13:47:51 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "collision.h" + +int collision_horizontal(t_map *map, t_player *player, double xa) +{ + t_tile tile; + + tile = get_tile(map, (int)((player->pos.x + xa)), (int)((player->pos.y))); + return (tile != TILE_WALL && tile != TILE_VOID && tile != TILE_DOOR); +} + +int collision_vertical(t_map *map, t_player *player, double ya) +{ + t_tile tile; + + tile = get_tile(map, (int)((player->pos.x)), (int)((player->pos.y + ya))); + return (tile != TILE_WALL && tile != TILE_VOID && tile != TILE_DOOR); +} diff --git a/src/game/collision.c b/src/game/collision/collision_sprite.c similarity index 72% rename from src/game/collision.c rename to src/game/collision/collision_sprite.c index 849e892..cd7486d 100644 --- a/src/game/collision.c +++ b/src/game/collision/collision_sprite.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* collision.c :+: :+: :+: */ +/* collision_sprite.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2025/04/22 14:40:59 by qmennen #+# #+# */ -/* Updated: 2025/06/11 20:17:16 by qmennen ### ########.fr */ +/* Created: 2025/06/12 13:48:08 by qmennen #+# #+# */ +/* Updated: 2025/06/12 13:48:55 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -58,19 +58,3 @@ int collision_sprite(t_game *game, double xa, double ya) } return (0); } - -int collision_horizontal(t_map *map, t_player *player, double xa) -{ - t_tile tile; - - tile = get_tile(map, (int)((player->pos.x + xa)), (int)((player->pos.y))); - return (tile != TILE_WALL && tile != TILE_VOID && tile != TILE_DOOR); -} - -int collision_vertical(t_map *map, t_player *player, double ya) -{ - t_tile tile; - - tile = get_tile(map, (int)((player->pos.x)), (int)((player->pos.y + ya))); - return (tile != TILE_WALL && tile != TILE_VOID && tile != TILE_DOOR); -} diff --git a/src/game/game.c b/src/game/core/game_create.c similarity index 50% rename from src/game/game.c rename to src/game/core/game_create.c index 1aa1fc9..75b7efb 100644 --- a/src/game/game.c +++ b/src/game/core/game_create.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/15 15:46:08 by qmennen #+# #+# */ -/* Updated: 2025/06/11 17:44:59 by qmennen ### ########.fr */ +/* Updated: 2025/06/12 16:05:45 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -27,51 +27,3 @@ int game_create(t_game **game) } return (SUCCESS); } - -void game_over(t_game_manager *manager) -{ - t_game *game; - - game = manager->game; - game->screen->hud->instances[0].enabled = false; - game->screen->minimap->instances[0].enabled = false; - game->screen->img->instances[0].enabled = false; - game->scoreboard->end_time = mlx_get_time(); - manager->state = GAME_STATE_END_SCREEN; - manager->active_menu = &manager->end_screen; - set_uniforms(game); -} - -void game_run(t_game *game) -{ - static int fps = 0; - - fps += (int)(1.f / game->screen->mlx->delta_time); - set_uniforms(game); - player_update(game, game->screen->mlx->delta_time); - cast_rays(game); - update_monsters(game); - render_map(game); - handle_battery(game); - handle_record(game); - handle_mouse(game); - collision_sprite(game, 0, 0); - if (game->player->battery <= 0 || count_tiles(game->map, TILE_EMPTY) == 0) - game_over(game->manager); -} - -void game_free(t_game *game) -{ - if (game->scoreboard) - free(game->scoreboard); - if (game->screen) - free(game->screen); - if (game->player) - free(game->player); - if (game->map) - map_free(game->map); - if (game->keyboard) - free(game->keyboard); - game->scoreboard = NULL; - free(game); -} diff --git a/src/game/core/game_free.c b/src/game/core/game_free.c new file mode 100644 index 0000000..66b8e1f --- /dev/null +++ b/src/game/core/game_free.c @@ -0,0 +1,29 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* game_free.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/04/15 15:46:08 by qmennen #+# #+# */ +/* Updated: 2025/06/12 16:03:18 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "game.h" + +void game_free(t_game *game) +{ + if (game->scoreboard) + free(game->scoreboard); + if (game->screen) + free(game->screen); + if (game->player) + free(game->player); + if (game->map) + map_free(game->map); + if (game->keyboard) + free(game->keyboard); + game->scoreboard = NULL; + free(game); +} diff --git a/src/game/core/game_over.c b/src/game/core/game_over.c new file mode 100644 index 0000000..71737b6 --- /dev/null +++ b/src/game/core/game_over.c @@ -0,0 +1,27 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* game_over.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/06/12 16:05:39 by qmennen #+# #+# */ +/* Updated: 2025/06/12 16:05:48 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "game.h" + +void game_over(t_game_manager *manager) +{ + t_game *game; + + game = manager->game; + game->screen->hud->instances[0].enabled = false; + game->screen->minimap->instances[0].enabled = false; + game->screen->img->instances[0].enabled = false; + game->scoreboard->end_time = mlx_get_time(); + manager->state = GAME_STATE_END_SCREEN; + manager->active_menu = &manager->end_screen; + shader_set_uniforms(game); +} diff --git a/src/game/core/game_run.c b/src/game/core/game_run.c new file mode 100644 index 0000000..8ac56ba --- /dev/null +++ b/src/game/core/game_run.c @@ -0,0 +1,31 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* game_run.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/06/12 16:05:15 by qmennen #+# #+# */ +/* Updated: 2025/06/12 16:05:29 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "game.h" + +void game_run(t_game *game) +{ + static int fps = 0; + + fps += (int)(1.f / game->screen->mlx->delta_time); + shader_set_uniforms(game); + player_update(game, game->screen->mlx->delta_time); + cast_rays(game); + monster_update(game); + render_map(game); + hud_update_battery(game); + hud_draw_record(game); + handle_mouse(game); + collision_sprite(game, 0, 0); + if (game->player->battery <= 0 || count_tiles(game->map, TILE_EMPTY) == 0) + game_over(game->manager); +} diff --git a/src/game/flash.c b/src/game/handle_flash.c similarity index 100% rename from src/game/flash.c rename to src/game/handle_flash.c diff --git a/src/game/game_hud.c b/src/game/hud/hud_draw_battery.c similarity index 50% rename from src/game/game_hud.c rename to src/game/hud/hud_draw_battery.c index 8a6a601..424bef1 100644 --- a/src/game/game_hud.c +++ b/src/game/hud/hud_draw_battery.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* game_hud.c :+: :+: :+: */ +/* hud_draw_battery.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2025/05/28 14:26:29 by qmennen #+# #+# */ -/* Updated: 2025/06/11 20:19:25 by qmennen ### ########.fr */ +/* Created: 2025/06/12 13:58:31 by qmennen #+# #+# */ +/* Updated: 2025/06/12 14:02:13 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,7 +22,7 @@ static int battery_color(float battery) return (0xFF000066); } -static void draw_battery(mlx_image_t *img, float battery) +void hud_draw_battery(mlx_image_t *img, float battery) { int x; int y; @@ -50,51 +50,3 @@ static void draw_battery(mlx_image_t *img, float battery) x++; } } - -void handle_battery(t_game *game) -{ - if (game->player->battery_charger > 0) - { - game->player->battery += (BATTERY_CHARGE / CHARGE_FRAMES); - game->player->battery_charger--; - } - if (game->player->battery > 1.0f) - { - game->player->battery = 1.0f; - } - game->player->battery -= game->screen->mlx->delta_time * BATTERY_RATE; - if (game->player->battery < 0) - { - game->player->battery = 0; - game->manager->state = GAME_STATE_MENU; - } - draw_battery(game->screen->minimap, game->player->battery); -} - -void handle_record(t_game *game) -{ - static int flash = 0; - int x; - int y; - - flash = (int) mlx_get_time() % 2; - y = -15; - while (y <= 15) - { - x = -15; - while (x <= 15) - { - if (x * x + y * y <= 225) - { - if (flash) - mlx_put_pixel( - game->screen->hud, 1530 + x, 212 + y, 0xFF000055); - else - mlx_put_pixel( - game->screen->hud, 1530 + x, 212 + y, 0x00000066); - } - x++; - } - y++; - } -} diff --git a/src/game/hud/hud_draw_record.c b/src/game/hud/hud_draw_record.c new file mode 100644 index 0000000..71506b1 --- /dev/null +++ b/src/game/hud/hud_draw_record.c @@ -0,0 +1,41 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* hud_draw_record.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/05/28 14:26:29 by qmennen #+# #+# */ +/* Updated: 2025/06/12 14:01:54 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "game.h" + +void hud_draw_record(t_game *game) +{ + static int flash = 0; + int x; + int y; + + flash = (int)mlx_get_time() % 2; + y = -15; + while (y <= 15) + { + x = -15; + while (x <= 15) + { + if (x * x + y * y <= 225) + { + if (flash) + mlx_put_pixel( + game->screen->hud, 1530 + x, 212 + y, 0xFF000055); + else + mlx_put_pixel( + game->screen->hud, 1530 + x, 212 + y, 0x00000066); + } + x++; + } + y++; + } +} diff --git a/src/game/hud/hud_update_battery.c b/src/game/hud/hud_update_battery.c new file mode 100644 index 0000000..95d1e7c --- /dev/null +++ b/src/game/hud/hud_update_battery.c @@ -0,0 +1,33 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* hud_update_battery.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/06/12 13:59:52 by qmennen #+# #+# */ +/* Updated: 2025/06/12 14:02:08 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "game.h" + +void hud_update_battery(t_game *game) +{ + if (game->player->battery_charger > 0) + { + game->player->battery += (BATTERY_CHARGE / CHARGE_FRAMES); + game->player->battery_charger--; + } + if (game->player->battery > 1.0f) + { + game->player->battery = 1.0f; + } + game->player->battery -= game->screen->mlx->delta_time * BATTERY_RATE; + if (game->player->battery < 0) + { + game->player->battery = 0; + game->manager->state = GAME_STATE_MENU; + } + hud_draw_battery(game->screen->minimap, game->player->battery); +} diff --git a/src/game/interact_door.c b/src/game/interact_door.c new file mode 100644 index 0000000..5f7c92b --- /dev/null +++ b/src/game/interact_door.c @@ -0,0 +1,25 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* interact_door.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/06/12 13:50:14 by qmennen #+# #+# */ +/* Updated: 2025/06/12 13:54:23 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "player.h" + +void interact_door(t_game *game) +{ + t_vec2_int pos; + + pos = vec2_to_int(add(game->player->pos, game->player->dir)); + if (game->map->grid[pos.y][pos.x] == TILE_DOOR) + { + game->map->grid[pos.y][pos.x] = TILE_EMPTY; + game->scoreboard->tiles_visited++; + } +} diff --git a/src/game/manager/game_manager_create.c b/src/game/manager/game_manager_create.c new file mode 100644 index 0000000..13c09e4 --- /dev/null +++ b/src/game/manager/game_manager_create.c @@ -0,0 +1,27 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* game_manager_create.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/06/12 14:04:29 by qmennen #+# #+# */ +/* Updated: 2025/06/12 14:05:10 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "game_manager.h" + +t_game_manager *game_manager_create(t_game *game, int state) +{ + t_game_manager *manager; + + manager = malloc(sizeof(t_game_manager)); + if (!manager) + return (NULL); + manager->game = game; + manager->menu = NULL; + manager->state = state; + game->manager = manager; + return (manager); +} diff --git a/src/manager/game_manager.c b/src/game/manager/game_manager_destroy.c similarity index 57% rename from src/manager/game_manager.c rename to src/game/manager/game_manager_destroy.c index f941eb9..6cb1e38 100644 --- a/src/manager/game_manager.c +++ b/src/game/manager/game_manager_destroy.c @@ -6,51 +6,12 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/27 13:48:18 by qmennen #+# #+# */ -/* Updated: 2025/06/11 15:00:38 by qmennen ### ########.fr */ +/* Updated: 2025/06/12 14:05:24 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ #include "game_manager.h" -t_game_manager *game_manager_create(t_game *game, int state) -{ - t_game_manager *manager; - - manager = malloc(sizeof(t_game_manager)); - if (!manager) - return (NULL); - manager->game = game; - manager->menu = NULL; - manager->state = state; - game->manager = manager; - return (manager); -} - -void game_manager_display(t_game_manager *manager) -{ - t_game *game; - - if (!manager || !manager->game) - return ; - game = manager->game; - if (manager->state == GAME_STATE_MENU) - menu_display(*(manager->active_menu), game->screen); - else if (manager->state == GAME_STATE_PLAYING) - game_run(game); - else if (manager->state == GAME_STATE_END_SCREEN) - draw_end_screen(manager, manager->end_screen); -} - -void game_manager_update(void *param) -{ - t_game_manager *manager; - - manager = (t_game_manager *)param; - game_manager_handle_input(manager); - game_manager_display(manager); - keyboard_update(manager->game); -} - void game_manager_destroy(void *param) { t_game_manager *manager; diff --git a/src/game/manager/game_manager_display.c b/src/game/manager/game_manager_display.c new file mode 100644 index 0000000..14d8cb0 --- /dev/null +++ b/src/game/manager/game_manager_display.c @@ -0,0 +1,28 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* game_manager_display.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/06/12 14:05:03 by qmennen #+# #+# */ +/* Updated: 2025/06/12 14:05:08 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "game_manager.h" + +void game_manager_display(t_game_manager *manager) +{ + t_game *game; + + if (!manager || !manager->game) + return ; + game = manager->game; + if (manager->state == GAME_STATE_MENU) + menu_display(*(manager->active_menu), game->screen); + else if (manager->state == GAME_STATE_PLAYING) + game_run(game); + else if (manager->state == GAME_STATE_END_SCREEN) + draw_end_screen(manager, manager->end_screen); +} diff --git a/src/manager/game_manager_utils.c b/src/game/manager/game_manager_input.c similarity index 86% rename from src/manager/game_manager_utils.c rename to src/game/manager/game_manager_input.c index 0c6c344..e73a228 100644 --- a/src/manager/game_manager_utils.c +++ b/src/game/manager/game_manager_input.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* game_manager_utils.c :+: :+: :+: */ +/* game_manager_input.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2025/05/27 15:22:15 by qmennen #+# #+# */ -/* Updated: 2025/06/05 18:44:32 by qmennen ### ########.fr */ +/* Created: 2025/06/12 14:07:08 by qmennen #+# #+# */ +/* Updated: 2025/06/12 14:09:24 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -23,6 +23,8 @@ void game_manager_select(t_game_manager *manager) void game_manager_handle_input(t_game_manager *manager) { + if (manager->state == GAME_STATE_PLAYING) + return ; if (get_key_down(manager->game, MLX_KEY_ENTER)) { game_manager_select(manager); diff --git a/src/game/manager/game_manager_update.c b/src/game/manager/game_manager_update.c new file mode 100644 index 0000000..c379e8e --- /dev/null +++ b/src/game/manager/game_manager_update.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* game_manager_update.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/06/12 14:05:26 by qmennen #+# #+# */ +/* Updated: 2025/06/12 14:08:51 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "game_manager.h" + +void game_manager_update(void *param) +{ + t_game_manager *manager; + + manager = (t_game_manager *)param; + game_manager_handle_input(manager); + game_manager_display(manager); + keyboard_update(manager->game); +} diff --git a/src/menu/end_screen.c b/src/game/menu/end_screen/end_screen.c similarity index 100% rename from src/menu/end_screen.c rename to src/game/menu/end_screen/end_screen.c diff --git a/src/menu/end_screen_utils.c b/src/game/menu/end_screen/end_screen_utils.c similarity index 100% rename from src/menu/end_screen_utils.c rename to src/game/menu/end_screen/end_screen_utils.c diff --git a/src/menu/main_menu.c b/src/game/menu/main_menu/main_menu.c similarity index 100% rename from src/menu/main_menu.c rename to src/game/menu/main_menu/main_menu.c diff --git a/src/menu/menu.c b/src/game/menu/menu_create.c similarity index 50% rename from src/menu/menu.c rename to src/game/menu/menu_create.c index fca9274..a2ffc37 100644 --- a/src/menu/menu.c +++ b/src/game/menu/menu_create.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* menu.c :+: :+: :+: */ +/* menu_create.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2025/05/27 14:31:53 by qmennen #+# #+# */ -/* Updated: 2025/06/11 15:02:35 by qmennen ### ########.fr */ +/* Created: 2025/06/12 14:10:04 by qmennen #+# #+# */ +/* Updated: 2025/06/12 14:10:14 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -32,57 +32,3 @@ t_menu *menu_create(t_game_manager *manager, char *b_path, menu->num_options = i; return (menu); } - -void menu_display(t_menu *menu, t_screen *screen) -{ - int i; - int half_h; - - half_h = screen->height / 2; - if (menu->hidden) - menu_toggle(menu); - menu->selector->instances[0].x = 150; - menu->selector->instances[0].y = half_h + menu->selected_option * 50; - i = 0; - while (i < menu->num_options) - { - menu->items[i]->image->instances[0].x = 200; - menu->items[i]->image->instances[0].y = half_h + i * 50; - i++; - } -} - -void menu_toggle(t_menu *menu) -{ - int i; - - if (!menu) - return ; - menu->hidden = !menu->hidden; - if (menu->selector) - menu->selector->instances[0].enabled = !menu->hidden; - if (menu->background) - menu->background->instances[0].enabled = !menu->hidden; - i = -1; - while (++i < menu->num_options) - { - menu->items[i]->image->instances[0].enabled = !menu->hidden; - mlx_set_instance_depth(menu->items[i]->image->instances, 7); - } -} - -void menu_free(t_menu *menu, t_screen *screen) -{ - int i; - - (void)screen; - i = 0; - if (!menu) - return ; - while (i < menu->num_options) - { - free(menu->items[i]); - i++; - } - free(menu); -} diff --git a/src/game/menu/menu_display.c b/src/game/menu/menu_display.c new file mode 100644 index 0000000..84559f6 --- /dev/null +++ b/src/game/menu/menu_display.c @@ -0,0 +1,32 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* menu_display.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/06/12 14:10:43 by qmennen #+# #+# */ +/* Updated: 2025/06/12 14:12:55 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "game_menu.h" + +void menu_display(t_menu *menu, t_screen *screen) +{ + int i; + int half_h; + + half_h = screen->height / 2; + if (menu->hidden) + menu_toggle(menu); + menu->selector->instances[0].x = 150; + menu->selector->instances[0].y = half_h + menu->selected_option * 50; + i = 0; + while (i < menu->num_options) + { + menu->items[i]->image->instances[0].x = 200; + menu->items[i]->image->instances[0].y = half_h + i * 50; + i++; + } +} diff --git a/src/game/menu/menu_free.c b/src/game/menu/menu_free.c new file mode 100644 index 0000000..f6ce93d --- /dev/null +++ b/src/game/menu/menu_free.c @@ -0,0 +1,29 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* menu_free.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/06/12 14:11:01 by qmennen #+# #+# */ +/* Updated: 2025/06/12 14:11:11 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "game_menu.h" + +void menu_free(t_menu *menu, t_screen *screen) +{ + int i; + + (void)screen; + i = 0; + if (!menu) + return ; + while (i < menu->num_options) + { + free(menu->items[i]); + i++; + } + free(menu); +} diff --git a/src/menu/menu_item.c b/src/game/menu/menu_item_create.c similarity index 100% rename from src/menu/menu_item.c rename to src/game/menu/menu_item_create.c diff --git a/src/menu/menu_util.c b/src/game/menu/menu_set_background.c similarity index 88% rename from src/menu/menu_util.c rename to src/game/menu/menu_set_background.c index 8a43b4e..99f17be 100644 --- a/src/menu/menu_util.c +++ b/src/game/menu/menu_set_background.c @@ -1,18 +1,18 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* menu_util.c :+: :+: :+: */ +/* menu_set_background.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/28 14:45:59 by qmennen #+# #+# */ -/* Updated: 2025/06/05 18:47:58 by qmennen ### ########.fr */ +/* Updated: 2025/06/12 14:12:43 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ #include "game_menu.h" -mlx_image_t *menu_load_background(mlx_t *mlx, char *background_path) +static mlx_image_t *menu_load_background(mlx_t *mlx, char *background_path) { mlx_texture_t *background_texture; mlx_image_t *background_image; diff --git a/src/game/menu/menu_toggle.c b/src/game/menu/menu_toggle.c new file mode 100644 index 0000000..2ea6f6e --- /dev/null +++ b/src/game/menu/menu_toggle.c @@ -0,0 +1,32 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* menu_toggle.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/06/12 14:10:25 by qmennen #+# #+# */ +/* Updated: 2025/06/12 14:10:36 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "game_menu.h" + +void menu_toggle(t_menu *menu) +{ + int i; + + if (!menu) + return ; + menu->hidden = !menu->hidden; + if (menu->selector) + menu->selector->instances[0].enabled = !menu->hidden; + if (menu->background) + menu->background->instances[0].enabled = !menu->hidden; + i = -1; + while (++i < menu->num_options) + { + menu->items[i]->image->instances[0].enabled = !menu->hidden; + mlx_set_instance_depth(menu->items[i]->image->instances, 7); + } +} diff --git a/src/monster/monster.c b/src/game/monster/monster_update.c similarity index 87% rename from src/monster/monster.c rename to src/game/monster/monster_update.c index 0c72b4e..f816b54 100644 --- a/src/monster/monster.c +++ b/src/game/monster/monster_update.c @@ -1,18 +1,18 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* monster.c :+: :+: :+: */ +/* monster_update.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/28 17:15:52 by qmennen #+# #+# */ -/* Updated: 2025/06/11 16:22:09 by qmennen ### ########.fr */ +/* Updated: 2025/06/12 14:15:00 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ -#include "cub3d.h" +#include "monster.h" -void update_monsters(t_game *game) +void monster_update(t_game *game) { unsigned int i; t_vec2 d; diff --git a/src/game/moves.c b/src/game/moves.c deleted file mode 100644 index 6edd5ec..0000000 --- a/src/game/moves.c +++ /dev/null @@ -1,102 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* :::::::: */ -/* moves.c :+: :+: */ -/* +:+ */ -/* By: qmennen +#+ */ -/* +#+ */ -/* Created: 2025/05/14 20:08:27 by whaffman #+# #+# */ -/* Updated: 2025/06/10 19:38:49 by whaffman ######## odam.nl */ -/* */ -/* ************************************************************************** */ - -#include "cub3d.h" - -static void move(t_map *map, t_player *player, int dir, double delta) -{ - double xa; - double ya; - - xa = dir * player->dir.x * player->speed * delta; - ya = dir * player->dir.y * player->speed * delta; - if (xa != 0 && collision_horizontal(map, player, xa)) - { - player->pos.x += xa; - player->is_moving = 1; - } - if (ya != 0 && collision_vertical(map, player, ya)) - { - player->pos.y += ya; - player->is_moving = 1; - } -} - -static void strave(t_map *map, t_player *player, int dir, double delta) -{ - double xa; - double ya; - - xa = dir * perp(player->dir).x * player->speed * delta; - ya = dir * perp(player->dir).y * player->speed * delta; - if (xa != 0 && collision_horizontal(map, player, xa)) - { - player->pos.x += xa; - player->is_moving = 1; - } - if (ya != 0 && collision_vertical(map, player, ya)) - { - player->is_moving = 1; - player->pos.y += ya; - } -} - -void rotate(t_player *player, double rot_speed, double delta) -{ - player->dir = rot(player->dir, rot_speed * delta); - player->camera = rot(player->camera, rot_speed * delta); -} - -void visit_area(t_game *game) -{ - int i; - int x; - int y; - - i = 0; - while (i < 9) - { - x = game->player->pos.x + (i % 3) - 1; - y = game->player->pos.y + (i / 3) - 1; - if (get_tile(game->map, x, y) == TILE_EMPTY) - { - game->map->grid[y][x] = TILE_VISITED; - } - i++; - } -} - -void player_update(t_game *game, double delta_time) -{ - game->player->is_moving = 0; - visit_area(game); - if (get_key(game, MLX_KEY_W)) - move(game->map, game->player, 1, delta_time); - else if (get_key(game, MLX_KEY_S)) - move(game->map, game->player, -1, delta_time); - if (get_key(game, MLX_KEY_A)) - strave(game->map, game->player, -1, delta_time); - else if (get_key(game, MLX_KEY_D)) - strave(game->map, game->player, 1, delta_time); - if (get_key(game, MLX_KEY_LEFT)) - rotate(game->player, -2.5, delta_time); - else if (get_key(game, MLX_KEY_RIGHT)) - rotate(game->player, 2.5, delta_time); - if (get_key(game, MLX_KEY_SPACE)) - { - game->screen->flash = 3; - game->player->battery -= FLASH_BATTERY; - interact_door(game); - } - if (game->player->hit_timer > 0) - game->player->hit_timer -= .1f; -} diff --git a/src/game/player.c b/src/game/player/player_create.c similarity index 73% rename from src/game/player.c rename to src/game/player/player_create.c index a52532e..7c000aa 100644 --- a/src/game/player.c +++ b/src/game/player/player_create.c @@ -1,16 +1,16 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* player.c :+: :+: :+: */ +/* player_create.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/15 18:53:19 by qmennen #+# #+# */ -/* Updated: 2025/06/11 20:15:21 by qmennen ### ########.fr */ +/* Updated: 2025/06/12 13:50:37 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ -#include "cub3d.h" +#include "player.h" int player_create(t_game **game) { @@ -29,15 +29,3 @@ int player_create(t_game **game) (*game)->player = player; return (SUCCESS); } - -void interact_door(t_game *game) -{ - t_vec2_int pos; - - pos = vec2_to_int(add(game->player->pos, game->player->dir)); - if (game->map->grid[pos.y][pos.x] == TILE_DOOR) - { - game->map->grid[pos.y][pos.x] = TILE_EMPTY; - game->scoreboard->tiles_visited++; - } -} diff --git a/src/game/player/player_move.c b/src/game/player/player_move.c new file mode 100644 index 0000000..281edfc --- /dev/null +++ b/src/game/player/player_move.c @@ -0,0 +1,32 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* player_move.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/06/12 13:51:47 by qmennen #+# #+# */ +/* Updated: 2025/06/12 13:54:17 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "player.h" + +void player_move(t_map *map, t_player *player, int dir, double delta) +{ + double xa; + double ya; + + xa = dir * player->dir.x * player->speed * delta; + ya = dir * player->dir.y * player->speed * delta; + if (xa != 0 && collision_horizontal(map, player, xa)) + { + player->pos.x += xa; + player->is_moving = 1; + } + if (ya != 0 && collision_vertical(map, player, ya)) + { + player->pos.y += ya; + player->is_moving = 1; + } +} diff --git a/src/game/player/player_rotate.c b/src/game/player/player_rotate.c new file mode 100644 index 0000000..7c1a710 --- /dev/null +++ b/src/game/player/player_rotate.c @@ -0,0 +1,19 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* player_rotate.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/06/12 13:52:56 by qmennen #+# #+# */ +/* Updated: 2025/06/12 13:54:26 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "player.h" + +void player_rotate(t_player *player, double rot_speed, double delta) +{ + player->dir = rot(player->dir, rot_speed * delta); + player->camera = rot(player->camera, rot_speed * delta); +} diff --git a/src/game/player/player_strafe.c b/src/game/player/player_strafe.c new file mode 100644 index 0000000..9273638 --- /dev/null +++ b/src/game/player/player_strafe.c @@ -0,0 +1,32 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* player_strafe.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/05/14 20:08:27 by whaffman #+# #+# */ +/* Updated: 2025/06/12 14:02:30 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "player.h" + +void player_strafe(t_map *map, t_player *player, int dir, double delta) +{ + double xa; + double ya; + + xa = dir * perp(player->dir).x * player->speed * delta; + ya = dir * perp(player->dir).y * player->speed * delta; + if (xa != 0 && collision_horizontal(map, player, xa)) + { + player->pos.x += xa; + player->is_moving = 1; + } + if (ya != 0 && collision_vertical(map, player, ya)) + { + player->is_moving = 1; + player->pos.y += ya; + } +} diff --git a/src/game/player/player_update.c b/src/game/player/player_update.c new file mode 100644 index 0000000..32df3a1 --- /dev/null +++ b/src/game/player/player_update.c @@ -0,0 +1,58 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* player_update.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/06/12 13:51:16 by qmennen #+# #+# */ +/* Updated: 2025/06/12 14:02:42 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "player.h" + +static void visit_area(t_game *game) +{ + int i; + int x; + int y; + + i = 0; + while (i < 9) + { + x = game->player->pos.x + (i % 3) - 1; + y = game->player->pos.y + (i / 3) - 1; + if (get_tile(game->map, x, y) == TILE_EMPTY) + { + game->map->grid[y][x] = TILE_VISITED; + } + i++; + } +} + +void player_update(t_game *game, double delta_time) +{ + game->player->is_moving = 0; + visit_area(game); + if (get_key(game, MLX_KEY_W)) + player_move(game->map, game->player, 1, delta_time); + else if (get_key(game, MLX_KEY_S)) + player_move(game->map, game->player, -1, delta_time); + if (get_key(game, MLX_KEY_A)) + player_strafe(game->map, game->player, -1, delta_time); + else if (get_key(game, MLX_KEY_D)) + player_strafe(game->map, game->player, 1, delta_time); + if (get_key(game, MLX_KEY_LEFT)) + player_rotate(game->player, -2.5, delta_time); + else if (get_key(game, MLX_KEY_RIGHT)) + player_rotate(game->player, 2.5, delta_time); + if (get_key(game, MLX_KEY_SPACE)) + { + game->screen->flash = 3; + game->player->battery -= FLASH_BATTERY; + interact_door(game); + } + if (game->player->hit_timer > 0) + game->player->hit_timer -= .1f; +} diff --git a/src/main.c b/src/main.c index 702f08e..65f79fa 100644 --- a/src/main.c +++ b/src/main.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/15 16:01:29 by qmennen #+# #+# */ -/* Updated: 2025/06/11 14:58:56 by qmennen ### ########.fr */ +/* Updated: 2025/06/12 13:45:16 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -27,7 +27,7 @@ int main(int argc, char **argv) manager->menu = create_main_menu(manager); manager->end_screen = create_end_screen(manager); manager->active_menu = &manager->menu; - mlx_key_hook(game->screen->mlx, keyhandle, manager); + mlx_key_hook(game->screen->mlx, hook_keyboard, manager); mlx_loop_hook(game->screen->mlx, game_manager_update, manager); mlx_close_hook(game->screen->mlx, game_manager_destroy, manager); mlx_loop(game->screen->mlx); diff --git a/src/shader/shaders.c b/src/shader/shaders.c deleted file mode 100644 index 18f347a..0000000 --- a/src/shader/shaders.c +++ /dev/null @@ -1,121 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* shaders.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: qmennen +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/05/08 18:27:59 by qmennen #+# #+# */ -/* Updated: 2025/06/11 17:49:30 by qmennen ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "cub3d.h" -#include "glad.h" -#include "MLX42_Int.h" - -void set_uniforms(t_game *game) -{ - glUniform1f(game->screen->u_time_location, (float)mlx_get_time()); - glUniform1i(game->screen->u_ismoving_location, - game->player->is_moving); - glUniform1f(game->screen->u_battery_location, game->player->battery); - glUniform2f(game->screen->u_resolution_location, - (float)game->screen->width, (float)game->screen->height); - glUniform1f(game->screen->u_hit_timer_location, game->player->hit_timer); - glUniform1i(game->screen->u_enabled_location, - game->manager->state == GAME_STATE_PLAYING); -} - -int load_uniforms(t_game **game) -{ - mlx_ctx_t *ctx; - - ctx = (mlx_ctx_t *)(*game)->screen->mlx->context; - (*game)->screen->u_time_location = glGetUniformLocation( - ctx->shaderprogram, "u_time"); - (*game)->screen->u_battery_location = glGetUniformLocation( - ctx->shaderprogram, "u_battery"); - (*game)->screen->u_hit_timer_location = glGetUniformLocation( - ctx->shaderprogram, "u_hit_timer"); - (*game)->screen->u_enabled_location = glGetUniformLocation( - ctx->shaderprogram, "u_enabled"); - (*game)->screen->u_resolution_location = glGetUniformLocation( - ctx->shaderprogram, "u_resolution"); - (*game)->screen->u_ismoving_location = glGetUniformLocation( - ctx->shaderprogram, "u_ismoving"); - if ((*game)->screen->u_time_location < 0 - || (*game)->screen->u_battery_location < 0 - || (*game)->screen->u_hit_timer_location < 0 - || (*game)->screen->u_enabled_location < 0 - || (*game)->screen->u_resolution_location < 0) - return (FAILURE); - return (SUCCESS); -} - -static const char *read_vertex_shader(void) -{ - const char *target = "./assets/shaders/vert.glsl"; - char *shader; - int fd; - int file_size; - ssize_t bytes_read; - - file_size = get_file_size(target); - fd = open(target, O_RDONLY); - if (fd < 0) - return (perror("Error opening shader file"), NULL); - shader = malloc(file_size * sizeof(char) + 1); - if (!shader) - { - return (perror("Error allocating memory for shader"), close(fd), NULL); - } - bytes_read = read(fd, shader, file_size); - if (bytes_read < 0) - { - return (perror("Error reading shader file"), - free(shader), close(fd), NULL); - } - shader[bytes_read] = '\0'; - return (close(fd), shader); -} - -static const char *read_fragment_shader(void) -{ - const char *target = "./assets/shaders/frag.glsl"; - char *shader; - int fd; - int file_size; - ssize_t bytes_read; - - file_size = get_file_size(target); - fd = open(target, O_RDONLY); - if (fd < 0) - { - return (perror("Error opening shader file"), NULL); - } - shader = malloc(file_size * sizeof(char) + 1); - if (!shader) - { - return (perror("Error allocating memory for shader"), close(fd), NULL); - } - bytes_read = read(fd, shader, file_size); - if (bytes_read < 0) - { - return (perror("Error reading shader file"), - free(shader), close(fd), NULL); - } - shader[bytes_read] = '\0'; - return (close(fd), shader); -} - -int shader_init(void) -{ - vert_shader = read_vertex_shader(); - if (!vert_shader) - return (FAILURE); - frag_shader = read_fragment_shader(); - if (!frag_shader) - return (FAILURE); - return (SUCCESS); -} diff --git a/src/texture/texutre_load.c b/src/texture/texutre_load.c deleted file mode 100644 index bdc860a..0000000 --- a/src/texture/texutre_load.c +++ /dev/null @@ -1,47 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* :::::::: */ -/* texutre_load.c :+: :+: */ -/* +:+ */ -/* By: whaffman +#+ */ -/* +#+ */ -/* Created: 2025/05/06 15:45:58 by qmennen #+# #+# */ -/* Updated: 2025/05/23 17:29:13 by whaffman ######## odam.nl */ -/* */ -/* ************************************************************************** */ - -#include "texture.h" - -void texture_delete(t_game *game) -{ - int i; - - i = 0; - while (i < 4) - { - if (game->map->textures[i]) - mlx_delete_texture(game->map->textures[i]); - i++; - } - if (game->map->texture_floor) - { - mlx_delete_texture(game->map->texture_floor); - game->map->texture_floor = NULL; - } - if (game->map->texture_ceiling) - { - mlx_delete_texture(game->map->texture_ceiling); - game->map->texture_ceiling = NULL; - } -} - -int texture_load(t_game *game) -{ - if (!game->map->textures[SIDE_NORTH] || !game->map->textures[SIDE_EAST] - || !game->map->textures[SIDE_SOUTH] || !game->map->textures[SIDE_WEST]) - { - texture_delete(game); - return (FAILURE); - } - return (SUCCESS); -}