feat (menus)

This commit is contained in:
Quinten Mennen 2025-05-27 20:46:00 +02:00
parent b98400db00
commit 6cb74c3b78
16 changed files with 258 additions and 90 deletions

View File

@ -11,7 +11,9 @@
"render.h": "c",
"math.h": "c",
"mlx42_int.h": "c",
"glad.h": "c"
"glad.h": "c",
"game_menu.h": "c",
"game_manager.h": "c"
},
"cmake.ignoreCMakeListsMissing": true
}

View File

@ -1,12 +1,12 @@
# **************************************************************************** #
# #
# :::::::: #
# Makefile :+: :+: #
# +:+ #
# By: qmennen <qmennen@student.codam.nl> +#+ #
# +#+ #
# ::: :::::::: #
# Makefile :+: :+: :+: #
# +:+ +:+ +:+ #
# By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ #
# +#+#+#+#+#+ +#+ #
# Created: 2024/10/15 11:48:46 by whaffman #+# #+# #
# Updated: 2025/05/23 11:22:47 by whaffman ######## odam.nl #
# Updated: 2025/05/27 17:00:58 by qmennen ### ########.fr #
# #
# **************************************************************************** #

View File

@ -1,14 +1,16 @@
# Cub3d (by Quinten & Willem)
## TODO
- [ ] **Config Parsing:** support inclusion of sprites in the format (-{type: c, s} {identifier} {path})
- [ ] **Map Parsing:** Keep in mind the possible addition of sprites / collectibles
- [ ] **Gameplay:** Allow sprites to be collected (stopping them from being rendered)
- [x] **Config Parsing:** support inclusion of sprites in the format (-{type: c, s} {identifier} {path})
- [x] **Map Parsing:** Keep in mind the possible addition of sprites / collectibles
- [x] **Gameplay:** Allow sprites to be collected (stopping them from being rendered)
- [ ] **Rendering:** Allow for either floor/ceiling textures *or* colors.
- [ ] **Gameplay:** Implement doors/exits
- [ ] **UX:** Allow user to capture moues and use it for looking. Also allow capture release.
- [ ] **UX:** Title / end screen
- [x] **UX:** Title / end screen
- [ ] **Map Design:** Design a map for captivating gameplay.
- [ ] **Map Parsing:** When unidentified character appears, seg fault does too
- [ ] **Map Parsing:** Able to run the game with no player
## Gameplay
- Your on surveillance and you need

BIN
assets/menu.xcf Normal file

Binary file not shown.

BIN
assets/menu_background.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 MiB

89
big.cub Normal file
View File

@ -0,0 +1,89 @@
NO ./assets/tiles256.png
WE ./assets/bricks2.png
SO ./assets/stonewall256.png
EA ./assets/bricksx64.png
F 90,30,30
C 100,100,200
FT ./assets/tiles3.png
CT ./assets/ceiling64x64.png
-s a ./assets/lamp.png
-c b ./assets/accu.png
-s p ./assets/plant.png
-s m ./assets/broken_mirror.png
-s t ./assets/test.png
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
10000000000N0000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

View File

@ -6,7 +6,7 @@
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/04/15 12:22:29 by qmennen #+# #+# */
/* Updated: 2025/05/27 15:24:09 by qmennen ### ########.fr */
/* Updated: 2025/05/27 18:14:06 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
@ -37,9 +37,10 @@
# define NUM_KEYS 300
# define TILE_SIZE 8
# define MINIMAP_SIZE 300
# define NUM_MENU_OPTIONS 2
# define MAX_MENU_OPTIONS 3
# define MENU_OPTION_START 0
# define MENU_OPTION_EXIT 1
# define MENU_OPTION_SCOREBOARD 1
# define MENU_OPTION_EXIT 2
# include "MLX42.h"
# include "allowed.h"

View File

@ -6,7 +6,7 @@
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/05/27 13:40:20 by qmennen #+# #+# */
/* Updated: 2025/05/27 15:22:43 by qmennen ### ########.fr */
/* Updated: 2025/05/27 18:34:07 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
@ -20,5 +20,6 @@ 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(t_game_manager *manager);
#endif

View File

@ -6,7 +6,7 @@
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/05/27 15:07:48 by qmennen #+# #+# */
/* Updated: 2025/05/27 15:08:37 by qmennen ### ########.fr */
/* Updated: 2025/05/27 18:41:31 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
@ -15,8 +15,9 @@
# include "cub3d.h"
void menu_create(t_game_manager **manager);
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);
#endif

View File

@ -6,7 +6,7 @@
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/04/15 15:52:44 by qmennen #+# #+# */
/* Updated: 2025/05/27 15:18:58 by qmennen ### ########.fr */
/* Updated: 2025/05/27 18:42:09 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
@ -58,7 +58,6 @@ typedef struct s_player
float battery;
} t_player;
typedef struct s_sprite
{
int n_frames;
@ -108,7 +107,6 @@ typedef struct s_screen
mlx_image_t *minimap;
mlx_image_t *background;
mlx_image_t *hud;
mlx_image_t *menu;
unsigned int width;
unsigned int height;
} t_screen;
@ -152,13 +150,15 @@ typedef struct s_game
t_game_state state;
} t_game;
typedef struct s_menu
{
mlx_texture_t *background;
mlx_image_t *options[NUM_MENU_OPTIONS];
mlx_image_t *selector;
int selected_option;
int num_options;
int hidden;
char *options[MAX_MENU_OPTIONS];
mlx_image_t *option_images[MAX_MENU_OPTIONS];
mlx_image_t *selector;
mlx_image_t *background_image;
} t_menu;
@ -166,6 +166,8 @@ typedef struct s_game_manager
{
t_game *game;
t_menu *menu;
t_menu *end_screen;
t_menu **active_menu;
} t_game_manager;
#endif

View File

@ -6,12 +6,11 @@
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/04/15 16:01:29 by qmennen #+# #+# */
/* Updated: 2025/05/27 15:08:44 by qmennen ### ########.fr */
/* Updated: 2025/05/27 18:40:16 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
#include "cub3d.h"
#include "glad.h"
int main(int argc, char **argv)
{
@ -30,10 +29,14 @@ int main(int argc, char **argv)
return (EXIT_FAILURE);
}
manager = game_manager_create(game);
menu_create(&manager);
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;
mlx_key_hook(game->screen->mlx, keyhandle, game);
mlx_loop_hook(game->screen->mlx, game_manager_update, manager);
mlx_loop(game->screen->mlx);
game_terminate(game);
game_manager_destroy(manager);
return (EXIT_SUCCESS);
}

View File

@ -6,7 +6,7 @@
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/05/27 13:48:18 by qmennen #+# #+# */
/* Updated: 2025/05/27 15:23:04 by qmennen ### ########.fr */
/* Updated: 2025/05/27 18:39:36 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
@ -32,7 +32,7 @@ void game_manager_display(t_game_manager *manager)
game = manager->game;
if (game->state == GAME_STATE_MENU)
{
menu_display(manager->menu, game->screen);
menu_display(*(manager->active_menu), game->screen);
}
else if (game->state == GAME_STATE_PLAYING)
{
@ -49,3 +49,20 @@ void game_manager_update(void *param)
game_manager_display(manager);
keyboard_update(manager->game);
}
void game_manager_destroy(t_game_manager *manager)
{
if (!manager)
return;
if (manager->menu)
menu_free(manager->menu, manager->game->screen);
if (manager->end_screen)
menu_free(manager->end_screen, manager->game->screen);
print_scores(manager->game);
if (manager->game)
{
game_free(manager->game);
}
free(manager);
exit(EXIT_SUCCESS);
}

View File

@ -6,7 +6,7 @@
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/05/27 15:22:15 by qmennen #+# #+# */
/* Updated: 2025/05/27 15:23:11 by qmennen ### ########.fr */
/* Updated: 2025/05/27 18:40:45 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
@ -32,16 +32,18 @@ static void game_start(t_game *game)
void game_manager_select(t_game_manager *manager)
{
if (manager->menu->selected_option == 0)
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_free(manager->menu, manager->game->screen);
menu_toggle(*(manager->active_menu), manager->game->screen);
game_start(manager->game);
return ;
}
else if (manager->menu->selected_option == 1)
{
menu_free(manager->menu, manager->game->screen);
game_terminate(manager->game);
}
}
void game_manager_handle_input(t_game_manager *manager)
@ -53,14 +55,14 @@ void game_manager_handle_input(t_game_manager *manager)
}
if (get_key_up(manager->game, MLX_KEY_DOWN))
{
manager->menu->selected_option++;
if (manager->menu->selected_option >= NUM_MENU_OPTIONS)
manager->menu->selected_option = 0;
(*manager->active_menu)->selected_option++;
if ((*manager->active_menu)->selected_option >= (*manager->active_menu)->num_options)
(*manager->active_menu)->selected_option = 0;
}
if (get_key_up(manager->game, MLX_KEY_UP))
{
manager->menu->selected_option--;
(*manager->active_menu)->selected_option--;
if (manager->menu->selected_option < 0)
manager->menu->selected_option = NUM_MENU_OPTIONS - 1;
manager->menu->selected_option = manager->menu->num_options - 1;
}
}

View File

@ -6,63 +6,130 @@
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/05/27 14:31:53 by qmennen #+# #+# */
/* Updated: 2025/05/27 15:09:11 by qmennen ### ########.fr */
/* Updated: 2025/05/27 18:37:03 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
# include "game_menu.h"
void menu_create(t_game_manager **manager)
static mlx_image_t *menu_load_background(mlx_t *mlx, char *background_path)
{
mlx_texture_t *background_texture;
mlx_image_t *background_image;
if (!background_path)
return (NULL);
background_texture = mlx_load_png(background_path);
if (!background_texture)
{
printf("Failed to load background texture from %s\n", background_path);
return (NULL);
}
background_image = mlx_texture_to_image(mlx, background_texture);
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;
int i;
menu = malloc(sizeof(t_menu));
if (!menu)
return;
menu->background = NULL;
ft_memset(menu->options, 0, sizeof(menu->options));
return (NULL);
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)
{
printf("Failed to display background image\n");
mlx_delete_image(manager->game->screen->mlx, menu->background_image);
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;
(*manager)->menu = menu;
menu->num_options = 0;
menu->hidden = 1;
i = -1;
while (options[++i] != NULL)
{
menu->options[i] = (char *)options[i];
menu->num_options++;
}
return (menu);
}
void menu_display(t_menu *menu, t_screen *screen)
{
const char *options[NUM_MENU_OPTIONS] = {
"Start Game",
"Exit"
};
int i;
if (menu->hidden)
{
menu_toggle(menu, screen);
}
if (menu->selector == 0)
{
menu->selector = mlx_put_string(screen->mlx, ">", screen->width / 2 - 100, 0);
}
i = 0;
while (i < NUM_MENU_OPTIONS)
while (i < menu->num_options)
{
if (i == menu->selected_option && menu->selector)
{
menu->selector->instances[0].y = (screen->height - 100) / 2 + i * 50;
}
if (menu->options[i] == 0)
if (menu->option_images[i] == 0)
{
menu->options[i] = mlx_put_string(screen->mlx, options[i],
(screen->width - ft_strlen(options[i]) * 10) / 2,
menu->option_images[i] = mlx_put_string(screen->mlx, menu->options[i],
(screen->width - ft_strlen(menu->options[i]) * 10) / 2,
(screen->height - 100) / 2 + i * 50);
}
i++;
}
}
void menu_free(t_menu *menu, t_screen *screen)
void menu_toggle(t_menu *menu, t_screen *screen)
{
int i;
if (!menu)
return;
if (menu->options[0])
mlx_delete_image(screen->mlx, menu->options[0]);
if (menu->options[1])
mlx_delete_image(screen->mlx, menu->options[1]);
menu->hidden = !menu->hidden;
if (menu->selector)
{
menu->selector->instances[0].enabled = !menu->hidden;
}
if (menu->background_image)
{
menu->background_image->instances[0].enabled = !menu->hidden;
}
i = -1;
while (i++ < menu->num_options)
{
if (menu->option_images[i])
{
menu->option_images[i]->instances[0].enabled = !menu->hidden;
}
}
}
void menu_free(t_menu *menu, t_screen *screen)
{
int i;
i = 0;
if (!menu)
return;
while (i < menu->num_options)
{
if (menu->option_images[i])
{
mlx_delete_image(screen->mlx, menu->option_images[i]);
}
i++;
}
if (menu->selector)
mlx_delete_image(screen->mlx, menu->selector);
if (menu->background_image)
mlx_delete_image(screen->mlx, menu->background_image);
free(menu);
}

View File

@ -6,7 +6,7 @@
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/04/15 15:30:27 by qmennen #+# #+# */
/* Updated: 2025/05/27 14:18:53 by qmennen ### ########.fr */
/* Updated: 2025/05/27 16:59:17 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
@ -23,6 +23,7 @@ int screen_create(t_game **game)
screen->width = WIDTH;
screen->height = HEIGHT;
mlx_set_setting(MLX_FULLSCREEN, 0);
mlx_set_setting(MLX_STRETCH_IMAGE, 1);
mlx = mlx_init(WIDTH, HEIGHT, TITLE, true);
if (!mlx)
return (FAILURE);
@ -36,9 +37,6 @@ int screen_create(t_game **game)
screen->background = mlx_new_image(screen->mlx, WIDTH, HEIGHT);
if (!screen->background)
return (FAILURE);
screen->menu = mlx_new_image(screen->mlx, WIDTH, HEIGHT);
if (!screen->menu)
return (FAILURE);
(*game)->screen = screen;
return (SUCCESS);
}
@ -92,16 +90,6 @@ int screen_display(t_screen *screen)
printf(RED"Failed to display buffer image\n"RESET);
return (FAILURE);
}
// if (mlx_image_to_window(screen->mlx, screen->minimap, 175, 575) < 0)
// {
// printf(RED"Failed to display buffer image\n"RESET);
// return (FAILURE);
// }
// if (mlx_image_to_window(screen->mlx, screen->hud, 0, 0) < 0)
// {
// printf(RED"Failed to display buffer image\n"RESET);
// return (FAILURE);
// }
if (!center_window(screen))
return (FAILURE);
return (SUCCESS);

View File

@ -6,7 +6,7 @@
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/05/08 18:27:59 by qmennen #+# #+# */
/* Updated: 2025/05/27 13:39:41 by qmennen ### ########.fr */
/* Updated: 2025/05/27 18:45:57 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
@ -41,27 +41,20 @@ const char *read_shader(int type)
fd = open(target, O_RDONLY);
if (fd < 0)
{
perror("Error opening shader file");
return (NULL);
return (perror("Error opening shader file"), NULL);
}
shader = malloc(4096);
if (!shader)
{
perror("Error allocating memory for shader");
close(fd);
return (NULL);
return (perror("Error allocating memory for shader"), close(fd), NULL);
}
bytes_read = read(fd, shader, 4096);
if (bytes_read < 0)
{
perror("Error reading shader file");
free(shader);
close(fd);
return (NULL);
return (perror("Error reading shader file"), free(shader), close(fd), NULL);
}
shader[bytes_read] = '\0';
close(fd);
return (shader);
return (close(fd), shader);
}
int shader_init(t_game **game)