From 8521bfa7e4a977a66e60b6e90812e95c817ba25e Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Wed, 28 May 2025 14:23:42 +0200 Subject: [PATCH] feat: menu items and action callbacks --- inc/game_menu.h | 13 ++++--- inc/types.h | 31 ++++++++++------- src/game.c | 16 ++++----- src/main.c | 15 ++++----- src/manager/game_manager.c | 7 ++-- src/manager/game_manager_utils.c | 31 ++--------------- src/map/grid_free.c | 15 ++++----- src/map/map_create.c | 16 ++++----- src/map/map_free.c | 19 +++++------ src/menu/main_menu.c | 58 ++++++++++++++++++++++++++++++++ src/menu/menu.c | 31 ++++++++--------- src/menu/menu_item.c | 27 +++++++++++++++ src/screen.c | 3 +- 13 files changed, 174 insertions(+), 108 deletions(-) create mode 100644 src/menu/main_menu.c create mode 100644 src/menu/menu_item.c diff --git a/inc/game_menu.h b/inc/game_menu.h index 0eff555..ffd8d66 100644 --- a/inc/game_menu.h +++ b/inc/game_menu.h @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/27 15:07:48 by qmennen #+# #+# */ -/* Updated: 2025/05/27 18:41:31 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 14:15:18 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,9 +15,12 @@ # include "cub3d.h" -void menu_display(t_menu *menu, t_screen *screen); -t_menu *menu_create(t_game_manager *manager, char *background_path, const char *options[]); -void menu_free(t_menu *menu, t_screen *screen); -void menu_toggle(t_menu *menu, t_screen *screen); +void menu_display(t_menu *menu, t_screen *screen); +t_menu *create_main_menu(t_game_manager *manager); +t_menu *menu_create(t_game_manager *manager, char *background_path, const t_menu_item *options[]); +t_menu_item *menu_item_create(const char *text, + void (*act)(struct s_menu_item *item, t_game_manager *manager)); +void menu_free(t_menu *menu, t_screen *screen); +void menu_toggle(t_menu *menu, t_screen *screen); #endif \ No newline at end of file diff --git a/inc/types.h b/inc/types.h index 2f984cc..d011f86 100644 --- a/inc/types.h +++ b/inc/types.h @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/15 15:52:44 by qmennen #+# #+# */ -/* Updated: 2025/05/27 18:42:09 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 14:17:55 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -147,27 +147,34 @@ typedef struct s_game t_keyboard *keyboard; int framecount; int fps; - t_game_state state; } t_game; +typedef struct s_game_manager +{ + t_game_state state; + t_game *game; + struct s_menu *menu; + struct s_menu *end_screen; + struct s_menu **active_menu; +} t_game_manager; + +typedef struct s_menu_item +{ + char *text; + mlx_image_t *image; + void (*act)(struct s_menu_item *item, t_game_manager *manager); +} t_menu_item; typedef struct s_menu { int selected_option; int num_options; int hidden; - char *options[MAX_MENU_OPTIONS]; - mlx_image_t *option_images[MAX_MENU_OPTIONS]; + t_menu_item *items[MAX_MENU_OPTIONS]; + // char *options[MAX_MENU_OPTIONS]; + // mlx_image_t *option_images[MAX_MENU_OPTIONS]; mlx_image_t *selector; mlx_image_t *background_image; } t_menu; -typedef struct s_game_manager -{ - t_game *game; - t_menu *menu; - t_menu *end_screen; - t_menu **active_menu; -} t_game_manager; - #endif diff --git a/src/game.c b/src/game.c index e842cbf..7afd721 100644 --- a/src/game.c +++ b/src/game.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/15 15:46:08 by qmennen #+# #+# */ -/* Updated: 2025/05/27 15:11:11 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 14:20:43 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,8 +19,8 @@ int game_create(t_game **game) *game = malloc(sizeof(t_game)); if (!game) return (FAILURE); - memset(*game, 0, sizeof(t_game)); - (*game)->state = GAME_STATE_MENU; + ft_memset(*game, 0, sizeof(t_game)); + // (*game)->state = GAME_STATE_MENU; (*game)->fps = 20; return (SUCCESS); } @@ -157,13 +157,13 @@ void game_run(t_game *game) void game_free(t_game *game) { - if (game->screen->hud) - { - mlx_delete_image(game->screen->mlx, game->screen->hud); - game->screen->hud = NULL; - } if (game->screen) { + if (game->screen->hud) + { + mlx_delete_image(game->screen->mlx, game->screen->hud); + game->screen->hud = NULL; + } mlx_delete_image(game->screen->mlx, game->screen->img); mlx_close_window(game->screen->mlx); mlx_terminate(game->screen->mlx); diff --git a/src/main.c b/src/main.c index b89981a..894136d 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/05/27 18:40:16 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 14:15:30 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,8 +14,8 @@ int main(int argc, char **argv) { - t_game_manager *manager; - t_game *game; + t_game_manager *manager; + t_game *game; errno = 0; game = NULL; @@ -28,12 +28,9 @@ int main(int argc, char **argv) game_free(game); return (EXIT_FAILURE); } - manager = game_manager_create(game); - manager->menu = menu_create(manager, "./assets/menu_background.png", - (const char *[]){"Start Game", "Scoreboard", "Exit", NULL}); - manager->end_screen = menu_create(manager, "./assets/menu_background.png", - (const char *[]){"Game Over", "Exit", NULL}); - manager->active_menu = &manager->end_screen; + manager = game_manager_create(game); + manager->menu = create_main_menu(manager); + manager->active_menu = &manager->menu; mlx_key_hook(game->screen->mlx, keyhandle, game); mlx_loop_hook(game->screen->mlx, game_manager_update, manager); mlx_loop(game->screen->mlx); diff --git a/src/manager/game_manager.c b/src/manager/game_manager.c index 6f867ee..2fb0b20 100644 --- a/src/manager/game_manager.c +++ b/src/manager/game_manager.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/27 13:48:18 by qmennen #+# #+# */ -/* Updated: 2025/05/27 18:39:36 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 14:20:57 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,6 +20,7 @@ t_game_manager *game_manager_create(t_game *game) return (NULL); manager->game = game; manager->menu = NULL; + manager->state = GAME_STATE_MENU; return (manager); } @@ -30,11 +31,11 @@ void game_manager_display(t_game_manager *manager) if (!manager || !manager->game) return; game = manager->game; - if (game->state == GAME_STATE_MENU) + if (manager->state == GAME_STATE_MENU) { menu_display(*(manager->active_menu), game->screen); } - else if (game->state == GAME_STATE_PLAYING) + else if (manager->state == GAME_STATE_PLAYING) { game_run(game); } diff --git a/src/manager/game_manager_utils.c b/src/manager/game_manager_utils.c index c9230ad..b0b7a21 100644 --- a/src/manager/game_manager_utils.c +++ b/src/manager/game_manager_utils.c @@ -6,44 +6,19 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/27 15:22:15 by qmennen #+# #+# */ -/* Updated: 2025/05/27 18:40:45 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 14:23:14 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ #include "game_manager.h" -static void game_start(t_game *game) -{ - t_screen *screen; - - screen = game->screen; - if (mlx_image_to_window(screen->mlx, screen->minimap, 175, 575) < 0) - { - printf(RED "Failed to display buffer image\n" RESET); - game_terminate(game); - } - if (mlx_image_to_window(screen->mlx, screen->hud, 0, 0) < 0) - { - printf(RED "Failed to display buffer image\n" RESET); - game_terminate(game); - } - game->state = GAME_STATE_PLAYING; -} - void game_manager_select(t_game_manager *manager) { int selected_option; - int menu_screen; - menu_screen = manager->game->state == GAME_STATE_MENU; selected_option = (*manager->active_menu)->selected_option; - if (menu_screen && selected_option == 0) - { - menu_toggle(*(manager->active_menu), manager->game->screen); - game_start(manager->game); - return ; - } - + (*manager->active_menu)->items[selected_option]->act( + (*manager->active_menu)->items[selected_option], manager); } void game_manager_handle_input(t_game_manager *manager) diff --git a/src/map/grid_free.c b/src/map/grid_free.c index da78d2a..38cd0b1 100644 --- a/src/map/grid_free.c +++ b/src/map/grid_free.c @@ -1,16 +1,15 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* grid_free.c :+: :+: */ -/* +:+ */ -/* By: whaffman +#+ */ -/* +#+ */ -/* Created: 2025/04/23 12:20:38 by whaffman #+# #+# */ -/* Updated: 2025/05/25 18:57:09 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* grid_free.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/04/23 12:20:38 by whaffman #+# #+# */ +/* Updated: 2025/05/28 13:09:39 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ -#include #include "cub3d.h" void grid_free(t_tile **grid, int height) diff --git a/src/map/map_create.c b/src/map/map_create.c index a148990..e532831 100644 --- a/src/map/map_create.c +++ b/src/map/map_create.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* map_create.c :+: :+: */ -/* +:+ */ -/* By: whaffman +#+ */ -/* +#+ */ -/* Created: 2025/04/23 12:21:13 by whaffman #+# #+# */ -/* Updated: 2025/05/25 13:58:34 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* map_create.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/04/23 12:21:13 by whaffman #+# #+# */ +/* Updated: 2025/05/28 13:20:00 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,7 +20,7 @@ static int map_allocate(t_game **game) perror("Error allocating memory for (*game)->map"); return (FAILURE); } - ft_memset((*game)->map, 0, sizeof((*game)->map)); + ft_memset((*game)->map, 0, sizeof(t_map)); (*game)->map->sprite_lib = malloc(sizeof(t_sprite_lib) * 26); if (!(*game)->map->sprite_lib) { diff --git a/src/map/map_free.c b/src/map/map_free.c index 95e52ad..3b8ad20 100644 --- a/src/map/map_free.c +++ b/src/map/map_free.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* map_free.c :+: :+: */ -/* +:+ */ -/* By: whaffman +#+ */ -/* +#+ */ -/* Created: 2025/04/23 12:22:28 by whaffman #+# #+# */ -/* Updated: 2025/05/25 18:56:27 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* map_free.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/04/23 12:22:28 by whaffman #+# #+# */ +/* Updated: 2025/05/28 13:18:25 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,11 +16,8 @@ void map_free(t_map *map) { int i; + grid_free(map->grid, map->height); - // free(map->north_texture); - // free(map->south_texture); - // free(map->west_texture); - // free(map->east_texture); if(map->texture_floor) mlx_delete_texture(map->texture_floor); if(map->texture_ceiling) diff --git a/src/menu/main_menu.c b/src/menu/main_menu.c new file mode 100644 index 0000000..9717e13 --- /dev/null +++ b/src/menu/main_menu.c @@ -0,0 +1,58 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* main_menu.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/05/28 14:14:11 by qmennen #+# #+# */ +/* Updated: 2025/05/28 14:22:31 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "game_menu.h" + +static void game_exit(struct s_menu_item *item, t_game_manager *manager) +{ + (void)item; + game_manager_destroy(manager); +} + +static void game_start(struct s_menu_item *item, t_game_manager *manager) +{ + t_game *game; + t_screen *screen; + + (void)item; + game = manager->game; + screen = game->screen; + if (mlx_image_to_window(screen->mlx, screen->minimap, 175, 575) < 0) + { + printf(RED "Failed to display buffer image\n" RESET); + game_terminate(game); + } + if (mlx_image_to_window(screen->mlx, screen->hud, 0, 0) < 0) + { + printf(RED "Failed to display buffer image\n" RESET); + game_terminate(game); + } + menu_toggle(*(manager->active_menu), screen); + manager->state = GAME_STATE_PLAYING; +} + + +t_menu *create_main_menu(t_game_manager *manager) +{ + const t_menu_item *menu_items[] = { + menu_item_create("Start Game", game_start), + menu_item_create("Scoreboard", NULL), + menu_item_create("Exit", game_exit), + NULL + }; + t_menu *menu; + + menu = menu_create(manager, "./assets/menu_background.png", menu_items); + if (!menu) + return (NULL); + return (menu); +} \ No newline at end of file diff --git a/src/menu/menu.c b/src/menu/menu.c index db85e45..7aa8535 100644 --- a/src/menu/menu.c +++ b/src/menu/menu.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/27 14:31:53 by qmennen #+# #+# */ -/* Updated: 2025/05/27 18:37:03 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 14:12:58 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -29,13 +29,15 @@ static mlx_image_t *menu_load_background(mlx_t *mlx, char *background_path) return (mlx_delete_texture(background_texture), background_image); } -t_menu *menu_create(t_game_manager *manager, char *background_path, const char *options[]) +t_menu *menu_create(t_game_manager *manager, char *background_path, const t_menu_item *options[]) { t_menu *menu; int i; + menu = malloc(sizeof(t_menu)); if (!menu) return (NULL); + ft_memset(menu, 0, sizeof(t_menu)); menu->background_image = menu_load_background(manager->game->screen->mlx, background_path); if (mlx_image_to_window(manager->game->screen->mlx, menu->background_image, 0, 0) < 0) { @@ -44,17 +46,16 @@ t_menu *menu_create(t_game_manager *manager, char *background_path, const char * return (free(menu), NULL); } menu->background_image->instances[0].enabled = false; - ft_memset(menu->option_images, 0, sizeof(menu->option_images)); menu->selector = 0; menu->selected_option = 0; menu->num_options = 0; menu->hidden = 1; i = -1; - while (options[++i] != NULL) + while (options[++i]) { - menu->options[i] = (char *)options[i]; - menu->num_options++; + menu->items[i] = (t_menu_item *) options[i]; } + menu->num_options = 3; return (menu); } @@ -68,7 +69,7 @@ void menu_display(t_menu *menu, t_screen *screen) } if (menu->selector == 0) { - menu->selector = mlx_put_string(screen->mlx, ">", screen->width / 2 - 100, 0); + menu->selector = mlx_put_string(screen->mlx, ">", screen->width / 2 - 100, (screen->height - 100) / 2 + menu->selected_option * 50); } i = 0; while (i < menu->num_options) @@ -77,10 +78,10 @@ void menu_display(t_menu *menu, t_screen *screen) { menu->selector->instances[0].y = (screen->height - 100) / 2 + i * 50; } - if (menu->option_images[i] == 0) + if (menu->items[i]->image == 0) { - menu->option_images[i] = mlx_put_string(screen->mlx, menu->options[i], - (screen->width - ft_strlen(menu->options[i]) * 10) / 2, + menu->items[i]->image = mlx_put_string(screen->mlx, menu->items[i]->text, + (screen->width - ft_strlen(menu->items[i]->text) * 10) / 2, (screen->height - 100) / 2 + i * 50); } i++; @@ -103,11 +104,11 @@ void menu_toggle(t_menu *menu, t_screen *screen) menu->background_image->instances[0].enabled = !menu->hidden; } i = -1; - while (i++ < menu->num_options) + while (++i < menu->num_options) { - if (menu->option_images[i]) + if (menu->items[i]->image) { - menu->option_images[i]->instances[0].enabled = !menu->hidden; + menu->items[i]->image->instances[0].enabled = !menu->hidden; } } } @@ -121,9 +122,9 @@ void menu_free(t_menu *menu, t_screen *screen) return; while (i < menu->num_options) { - if (menu->option_images[i]) + if (menu->items[i]->image) { - mlx_delete_image(screen->mlx, menu->option_images[i]); + mlx_delete_image(screen->mlx, menu->items[i]->image); } i++; } diff --git a/src/menu/menu_item.c b/src/menu/menu_item.c new file mode 100644 index 0000000..6f6ea21 --- /dev/null +++ b/src/menu/menu_item.c @@ -0,0 +1,27 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* menu_item.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/05/28 13:50:14 by qmennen #+# #+# */ +/* Updated: 2025/05/28 14:16:33 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "game_menu.h" + +t_menu_item *menu_item_create(const char *text, + void (*act)(struct s_menu_item *item, t_game_manager *manager)) +{ + t_menu_item *item; + + item = malloc(sizeof(t_menu_item)); + if (!item) + return (NULL); + ft_memset(item, 0, sizeof(t_menu_item)); + item->text = (char *)text; + item->act = act; + return (item); +} \ No newline at end of file diff --git a/src/screen.c b/src/screen.c index 1660d6a..dce1f0f 100644 --- a/src/screen.c +++ b/src/screen.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/15 15:30:27 by qmennen #+# #+# */ -/* Updated: 2025/05/27 16:59:17 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 13:04:33 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,6 +20,7 @@ int screen_create(t_game **game) screen = malloc(sizeof(t_screen)); if (!screen) return (FAILURE); + ft_memset(screen, 0, sizeof(t_screen)); screen->width = WIDTH; screen->height = HEIGHT; mlx_set_setting(MLX_FULLSCREEN, 0);