Well, sort of 2D+ in truth...
Co-created with @HaruSnak
Below is an abbreviated presentation of the project – for a more complete tour, see: https://github.com/HaruSnak/Cub3D/
The final C project in 42's main cursus, Cub3D, is an implementation of a '3D' rendering engine using raycasting, a technique similar to the one used in classic games like Wolfenstein. The main goal is to create a three-dimensional maze from a 2D map, allowing the player to navigate an immersive environment from a first-person perspective. The program first enforces strict parsing of the maps, then the engine relies on a series of calculations to accurately project the rays outwards both horizontally and vertically in real time, giving the impression of a 3D map. The visual component was done largely through using MiniLibX, itself an API of sorts for X11, as imposed by the subject requirements.
.
└── 📁Cub3D
└── 📁assets
└── 📁textures
└── EA.PNG
└── EA.xpm
└── NO.PNG
└── NO.xpm
└── SO.png
└── SO.xpm
└── WE.PNG
└── WE.xpm
└── 📁ui
└── main_menu.png
└── main_menu.xpm
└── 📁includes
└── cub3d.h
└── 📁libft
└── 📁char
└── ft_isalnum.c
└── ft_isalpha.c
└── ft_isascii.c
└── ft_isdigit.c
└── ft_isprint.c
└── ft_tolower.c
└── ft_toupper.c
└── 📁conv
└── ft_atoi.c
└── ft_itoa.c
└── 📁gnl
└── get_next_line.c
└── 📁includes
└── libft.h
└── 📁lst
└── ft_lstadd_back_bonus.c
└── ft_lstadd_front_bonus.c
└── ft_lstclear_bonus.c
└── ft_lstdelone_bonus.c
└── ft_lstiter_bonus.c
└── ft_lstlast_bonus.c
└── ft_lstmap_bonus.c
└── ft_lstnew_bonus.c
└── ft_lstsize_bonus.c
└── Makefile
└── 📁mem
└── ft_bzero.c
└── ft_calloc.c
└── ft_memchr.c
└── ft_memcmp.c
└── ft_memcpy.c
└── ft_memmove.c
└── ft_memset.c
└── 📁put
└── ft_putchar_fd.c
└── ft_putendl_fd.c
└── ft_putnbr_fd.c
└── ft_putstr_fd.c
└── 📁str
└── ft_split.c
└── ft_strchr.c
└── ft_strcpy.c
└── ft_strdup.c
└── ft_striteri.c
└── ft_strjoin.c
└── ft_strlcat.c
└── ft_strlcpy.c
└── ft_strlen.c
└── ft_strmapi.c
└── ft_strncmp.c
└── ft_strnstr.c
└── ft_strrchr.c
└── ft_strtrim.c
└── ft_substr.c
└── 📁maps
└── error1.cub
└── error10.cub
└── error11.cub
└── error12.cub
└── error13.cub
└── error14.cub
└── error15.cub
└── error16.cub.ber
└── error17.cub
└── error18.cub
└── error19.cub
└── error2.cub
└── error20.cub
└── error21.cub
└── error22.cub
└── error23.cub
└── error24.cub
└── error25.cub
└── error26.cub
└── error27.cub
└── error28.cub
└── error29.cub
└── error3.cub
└── error30.cub
└── error31.cub
└── error32.cub
└── error33.cub
└── error34.cub
└── error35.cub
└── error36.cub
└── error37.cub
└── error38.cub
└── error39.cub
└── error4.cub
└── error40.cub
└── error41.cub
└── error42.cub
└── error43.cub
└── error44.cub
└── error45.cub
└── error46.cub
└── error47.cub
└── error48.cub
└── error49.cub
└── error5.cub
└── error50.cub
└── error51.cub
└── error52.cub
└── error53.cub
└── error54.cub
└── error55.cub
└── error56.cub
└── error57.cub
└── error6.cub
└── error7.cub
└── error8.cub
└── error9.cub
└── map1.cub
└── map2.cub
└── map3.cub
└── map4.cub
└── map5.cub
└── 📁minilibx-linux
└── .gitignore
└── configure
└── libmlx_Linux.a
└── libmlx.a
└── LICENSE
└── Makefile
└── Makefile.gen
└── Makefile.mk
└── 📁man
└── 📁man1
└── mlx_loop.1
└── mlx_new_image.1
└── mlx_new_window.1
└── mlx_pixel_put.1
└── mlx.1
└── 📁man3
└── mlx_loop.3
└── mlx_new_image.3
└── mlx_new_window.3
└── mlx_pixel_put.3
└── mlx.3
└── mlx_clear_window.c
└── mlx_destroy_display.c
└── mlx_destroy_image.c
└── mlx_destroy_window.c
└── mlx_expose_hook.c
└── mlx_ext_randr.c
└── mlx_flush_event.c
└── mlx_get_color_value.c
└── mlx_get_data_addr.c
└── mlx_hook.c
└── mlx_init.c
└── mlx_int_anti_resize_win.c
└── mlx_int_do_nothing.c
└── mlx_int_get_visual.c
└── mlx_int_param_event.c
└── mlx_int_set_win_event_mask.c
└── mlx_int_str_to_wordtab.c
└── mlx_int_wait_first_expose.c
└── mlx_int.h
└── mlx_key_hook.c
└── mlx_lib_xpm.c
└── mlx_loop_hook.c
└── mlx_loop.c
└── mlx_mouse_hook.c
└── mlx_mouse.c
└── mlx_new_image.c
└── mlx_new_window.c
└── mlx_pixel_put.c
└── mlx_put_image_to_window.c
└── mlx_rgb.c
└── mlx_screen_size.c
└── mlx_set_font.c
└── mlx_string_put.c
└── mlx_xpm.c
└── mlx_xpm.c.ok
└── mlx.h
└── 📁obj
└── mlx_clear_window.o
└── mlx_destroy_display.o
└── mlx_destroy_image.o
└── mlx_destroy_window.o
└── mlx_expose_hook.o
└── mlx_flush_event.o
└── mlx_get_color_value.o
└── mlx_get_data_addr.o
└── mlx_hook.o
└── mlx_init.o
└── mlx_int_anti_resize_win.o
└── mlx_int_do_nothing.o
└── mlx_int_get_visual.o
└── mlx_int_param_event.o
└── mlx_int_set_win_event_mask.o
└── mlx_int_str_to_wordtab.o
└── mlx_int_wait_first_expose.o
└── mlx_key_hook.o
└── mlx_loop_hook.o
└── mlx_loop.o
└── mlx_mouse_hook.o
└── mlx_mouse.o
└── mlx_new_image.o
└── mlx_new_window.o
└── mlx_pixel_put.o
└── mlx_put_image_to_window.o
└── mlx_rgb.o
└── mlx_screen_size.o
└── mlx_set_font.o
└── mlx_string_put.o
└── mlx_xpm.o
└── README.md
└── rgb2c.pl
└── 📁test
└── main.c
└── main.o
└── Makefile.gen
└── Makefile.mk
└── mlx-test
└── new_win.c
└── open.xpm
└── open24.xpm
└── open30.xpm
└── run_tests.sh
└── 📁srcs
└── 📁bonus
└── minimap.c
└── mouse_rotate.c
└── cub3d.c
└── 📁errors
└── errors.c
└── 📁game
└── settings.c
└── 📁parsing
└── parsing_map.c
└── parsing_rgb.c
└── parsing.c
└── verify_direction.c
└── verify_map.c
└── 📁player
└── init_player_controls.c
└── keys.c
└── player_init_movement.c
└── player_movement.c
└── rotate.c
└── 📁raycasting
└── raycasting_calcul_bis.c
└── raycasting_calcul.c
└── raycasting_draw.c
└── raycasting_init.c
└── 📁texturing
└── init_textures.c
└── 📁ui
└── main_menu.c
└── 📁utils
└── 📁utils-mlx
└── function_mlx.c
└── function_utils.c
└── parsing_utils.c
└── cub3d_tester.sh
└── LICENSE
└── Makefile
└── README.md
└── valgrind_output.txt
So yeah, just like that really.
Try it out if you like - feedback welcome!
