feat: menu items and action callbacks
This commit is contained in:
parent
6cb74c3b78
commit
8521bfa7e4
@ -6,7 +6,7 @@
|
||||
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* 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 */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
@ -16,7 +16,10 @@
|
||||
# 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[]);
|
||||
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);
|
||||
|
||||
|
||||
31
inc/types.h
31
inc/types.h
@ -6,7 +6,7 @@
|
||||
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* 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
|
||||
|
||||
10
src/game.c
10
src/game.c
@ -6,7 +6,7 @@
|
||||
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* 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)
|
||||
{
|
||||
if (game->screen->hud)
|
||||
{
|
||||
mlx_delete_image(game->screen->mlx, game->screen->hud);
|
||||
game->screen->hud = NULL;
|
||||
}
|
||||
if (game->screen)
|
||||
{
|
||||
mlx_delete_image(game->screen->mlx, game->screen->img);
|
||||
mlx_close_window(game->screen->mlx);
|
||||
mlx_terminate(game->screen->mlx);
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* 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 */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
@ -29,11 +29,8 @@ int main(int argc, char **argv)
|
||||
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->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);
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* 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);
|
||||
}
|
||||
|
||||
@ -6,44 +6,19 @@
|
||||
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* 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)
|
||||
|
||||
@ -1,16 +1,15 @@
|
||||
/* ************************************************************************** */
|
||||
/* */
|
||||
/* :::::::: */
|
||||
/* grid_free.c :+: :+: */
|
||||
/* +:+ */
|
||||
/* By: whaffman <whaffman@student.codam.nl> +#+ */
|
||||
/* +#+ */
|
||||
/* ::: :::::::: */
|
||||
/* grid_free.c :+: :+: :+: */
|
||||
/* +:+ +:+ +:+ */
|
||||
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2025/04/23 12:20:38 by whaffman #+# #+# */
|
||||
/* Updated: 2025/05/25 18:57:09 by whaffman ######## odam.nl */
|
||||
/* Updated: 2025/05/28 13:09:39 by qmennen ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
#include <stdlib.h>
|
||||
#include "cub3d.h"
|
||||
|
||||
void grid_free(t_tile **grid, int height)
|
||||
|
||||
@ -1,12 +1,12 @@
|
||||
/* ************************************************************************** */
|
||||
/* */
|
||||
/* :::::::: */
|
||||
/* map_create.c :+: :+: */
|
||||
/* +:+ */
|
||||
/* By: whaffman <whaffman@student.codam.nl> +#+ */
|
||||
/* +#+ */
|
||||
/* ::: :::::::: */
|
||||
/* map_create.c :+: :+: :+: */
|
||||
/* +:+ +:+ +:+ */
|
||||
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2025/04/23 12:21:13 by whaffman #+# #+# */
|
||||
/* Updated: 2025/05/25 13:58:34 by whaffman ######## odam.nl */
|
||||
/* 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)
|
||||
{
|
||||
|
||||
@ -1,12 +1,12 @@
|
||||
/* ************************************************************************** */
|
||||
/* */
|
||||
/* :::::::: */
|
||||
/* map_free.c :+: :+: */
|
||||
/* +:+ */
|
||||
/* By: whaffman <whaffman@student.codam.nl> +#+ */
|
||||
/* +#+ */
|
||||
/* ::: :::::::: */
|
||||
/* map_free.c :+: :+: :+: */
|
||||
/* +:+ +:+ +:+ */
|
||||
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2025/04/23 12:22:28 by whaffman #+# #+# */
|
||||
/* Updated: 2025/05/25 18:56:27 by whaffman ######## odam.nl */
|
||||
/* 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)
|
||||
|
||||
58
src/menu/main_menu.c
Normal file
58
src/menu/main_menu.c
Normal file
@ -0,0 +1,58 @@
|
||||
/* ************************************************************************** */
|
||||
/* */
|
||||
/* ::: :::::::: */
|
||||
/* main_menu.c :+: :+: :+: */
|
||||
/* +:+ +:+ +:+ */
|
||||
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* 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);
|
||||
}
|
||||
@ -6,7 +6,7 @@
|
||||
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* 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++;
|
||||
}
|
||||
|
||||
27
src/menu/menu_item.c
Normal file
27
src/menu/menu_item.c
Normal file
@ -0,0 +1,27 @@
|
||||
/* ************************************************************************** */
|
||||
/* */
|
||||
/* ::: :::::::: */
|
||||
/* menu_item.c :+: :+: :+: */
|
||||
/* +:+ +:+ +:+ */
|
||||
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* 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);
|
||||
}
|
||||
@ -6,7 +6,7 @@
|
||||
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* 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);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user