/42-cub3d

My Wolfenstein 3d game

Primary LanguageC


42-cub3d jremy's 42 cub3d Score

๐Ÿ“ My Wolfenstein 3D game!

โš™๏ธ Developed with the software and tools below:

GNU%20Bash C Markdown


๐Ÿ“ Overview

Cub3D is a project inspired by the game Wolfenstein3D, which is considered the first-ever developed first-person shooter (FPS). It explores the technique of ray-casting and challenges you to create a dynamic view within a maze where you need to find your way.

๐Ÿ’ซ Features

  • Collision with walls for a more realistic gaming experience.
  • Mini-map to visualize the structure of the maze.
  • Openable/closable doors to add interactions.
  • Animations with animated sprites to bring the game to life.
  • View rotation using the mouse for a more immersive exploration.
  • Enemies

๐Ÿ“‚ Project Structure

repo
โ”œโ”€โ”€ Makefile
โ”œโ”€โ”€ README.md
โ”œโ”€โ”€ en.subject.pdf
โ”œโ”€โ”€ img
โ”‚   โ””โ”€โ”€ cub.png
โ”œโ”€โ”€ includes
โ”‚   โ”œโ”€โ”€ colors.h
โ”‚   โ”œโ”€โ”€ cub3d.h
โ”‚   โ”œโ”€โ”€ keycodes.h
โ”‚   โ””โ”€โ”€ sprites.h
โ”œโ”€โ”€ libft
โ”‚   โ”œโ”€โ”€ Makefile
โ”‚   โ”œโ”€โ”€ gnl
โ”‚   โ”‚   โ”œโ”€โ”€ get_next_line.c
โ”‚   โ”‚   โ””โ”€โ”€ get_next_line_utils.c
โ”‚   โ”œโ”€โ”€ includes
โ”‚   โ”‚   โ”œโ”€โ”€ libft.h
โ”‚   โ”‚   โ””โ”€โ”€ printf.h
โ”‚   โ”œโ”€โ”€ list
โ”‚   โ”‚   โ”œโ”€โ”€ ft_lstadd_back.c
โ”‚   โ”‚   โ”œโ”€โ”€ ft_lstadd_front.c
โ”‚   โ”‚   โ”œโ”€โ”€ ft_lstaddsort.c
โ”‚   โ”‚   โ”œโ”€โ”€ ft_lstclear.c
โ”‚   โ”‚   โ”œโ”€โ”€ ft_lstdelone.c
โ”‚   โ”‚   โ”œโ”€โ”€ ft_lstiter.c
โ”‚   โ”‚   โ”œโ”€โ”€ ft_lstlast.c
โ”‚   โ”‚   โ”œโ”€โ”€ ft_lstmap.c
โ”‚   โ”‚   โ”œโ”€โ”€ ft_lstnew.c
โ”‚   โ”‚   โ””โ”€โ”€ ft_lstsize.c
โ”‚   โ”œโ”€โ”€ math
โ”‚   โ”œโ”€โ”€ mem
โ”‚   โ”‚   โ”œโ”€โ”€ ft_bzero.c
โ”‚   โ”‚   โ”œโ”€โ”€ ft_calloc.c
โ”‚   โ”‚   โ”œโ”€โ”€ ft_memchr.c
โ”‚   โ”‚   โ”œโ”€โ”€ ft_memcmp.c
โ”‚   โ”‚   โ”œโ”€โ”€ ft_memcpy.c
โ”‚   โ”‚   โ”œโ”€โ”€ ft_memmove.c
โ”‚   โ”‚   โ””โ”€โ”€ ft_memset.c
โ”‚   โ”œโ”€โ”€ print
โ”‚   โ”‚   โ”œโ”€โ”€ ft_putchar_fd.c
โ”‚   โ”‚   โ”œโ”€โ”€ ft_putendl_fd.c
โ”‚   โ”‚   โ”œโ”€โ”€ ft_putnbr_fd.c
โ”‚   โ”‚   โ””โ”€โ”€ ft_putstr_fd.c
โ”‚   โ”œโ”€โ”€ stdlib
โ”‚   โ”‚   โ”œโ”€โ”€ ft_atobyte.c
โ”‚   โ”‚   โ”œโ”€โ”€ ft_atoi.c
โ”‚   โ”‚   โ”œโ”€โ”€ ft_atol.c
โ”‚   โ”‚   โ””โ”€โ”€ ft_itoa.c
โ”‚   โ””โ”€โ”€ string
โ”‚       โ”œโ”€โ”€ ft_free_split.c
โ”‚       โ”œโ”€โ”€ ft_isalnum.c
โ”‚       โ”œโ”€โ”€ ft_isalpha.c
โ”‚       โ”œโ”€โ”€ ft_isascii.c
โ”‚       โ”œโ”€โ”€ ft_isdigit.c
โ”‚       โ”œโ”€โ”€ ft_isprint.c
โ”‚       โ”œโ”€โ”€ ft_size_split.c
โ”‚       โ”œโ”€โ”€ ft_split.c
โ”‚       โ”œโ”€โ”€ ft_splitcharset.c
โ”‚       โ”œโ”€โ”€ ft_strchr.c
โ”‚       โ”œโ”€โ”€ ft_strcmp.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
โ”‚       โ”œโ”€โ”€ ft_tolower.c
โ”‚       โ””โ”€โ”€ ft_toupper.c
โ”œโ”€โ”€ sprites[..]
โ”œโ”€โ”€ srcs
โ”‚   โ”œโ”€โ”€ colors.c
โ”‚   โ”œโ”€โ”€ create_img.c
โ”‚   โ”œโ”€โ”€ dda.c
โ”‚   โ”œโ”€โ”€ draw_sprite.c
โ”‚   โ”œโ”€โ”€ game.c
โ”‚   โ”œโ”€โ”€ gun.c
โ”‚   โ”œโ”€โ”€ handle_mouse.c
โ”‚   โ”œโ”€โ”€ hook_direction.c
โ”‚   โ”œโ”€โ”€ hook_direction_2.c
โ”‚   โ”œโ”€โ”€ hook_door.c
โ”‚   โ”œโ”€โ”€ hook_key_action.c
โ”‚   โ”œโ”€โ”€ hook_move.c
โ”‚   โ”œโ”€โ”€ init.c
โ”‚   โ”œโ”€โ”€ load_textures.c
โ”‚   โ”œโ”€โ”€ main.c
โ”‚   โ”œโ”€โ”€ minimaps.c
โ”‚   โ”œโ”€โ”€ mlx_img_utils.c
โ”‚   โ”œโ”€โ”€ mouse_utils.c
โ”‚   โ”œโ”€โ”€ parsing_bonus
โ”‚   โ”‚   โ”œโ”€โ”€ check_color.c
โ”‚   โ”‚   โ”œโ”€โ”€ debug_parsing.c
โ”‚   โ”‚   โ”œโ”€โ”€ exit.c
โ”‚   โ”‚   โ”œโ”€โ”€ info_utils.c
โ”‚   โ”‚   โ”œโ”€โ”€ load_info.c
โ”‚   โ”‚   โ”œโ”€โ”€ loading_maps.c
โ”‚   โ”‚   โ”œโ”€โ”€ maps_utils.c
โ”‚   โ”‚   โ””โ”€โ”€ parsing.c
โ”‚   โ”œโ”€โ”€ parsing_mandatory
โ”‚   โ”‚   โ”œโ”€โ”€ check_color.c
โ”‚   โ”‚   โ”œโ”€โ”€ debug_parsing.c
โ”‚   โ”‚   โ”œโ”€โ”€ exit.c
โ”‚   โ”‚   โ”œโ”€โ”€ info_utils.c
โ”‚   โ”‚   โ”œโ”€โ”€ load_info.c
โ”‚   โ”‚   โ”œโ”€โ”€ loading_maps.c
โ”‚   โ”‚   โ”œโ”€โ”€ maps_utils.c
โ”‚   โ”‚   โ””โ”€โ”€ parsing.c
โ”‚   โ”œโ”€โ”€ quit.c
โ”‚   โ”œโ”€โ”€ raycasting.c
โ”‚   โ”œโ”€โ”€ raycasting_utils.c
โ”‚   โ”œโ”€โ”€ sight_vector.c
โ”‚   โ”œโ”€โ”€ sprite.c
โ”‚   โ”œโ”€โ”€ sprite_utils.c
โ”‚   โ””โ”€โ”€ time.c
โ”œโ”€โ”€ textures[...]

๐Ÿš€ Getting Started

โœ… Prerequisites

Before you begin, ensure that you have the following prerequisites installed:

Requirements for Linux :

  • MinilibX only support TrueColor visual type (8,15,16,24 or 32 bits depth)
  • gcc
  • make
  • X11 include files (package xorg)
  • XShm extension must be present (package libxext-dev)
  • Utility functions from BSD systems - development files (package libbsd-dev) e.g. sudo apt-get install gcc make xorg libxext-dev libbsd-dev (Debian/Ubuntu)

Requirements for MacOS

  • Xquartz
Brew install Xquartz
reboot
xeyes # run an hello world X11 app

๐Ÿ–ฅ Installation

  1. Clone the 42-cub3d repository:
git clone https://github.com/jremy42/42-cub3d
  1. Change to the project directory:
cd 42-cub3d
  1. Compiling the project: mandatory :
make 

bonus :

make bonus

๐Ÿค– Using 42-cub3d

Please compiling with the bonuses is much more fun !

./cub3d [maps]

exemple :

./cub3d maps/bonus/minimaps_bonus.cub

Keybindings

  • Escape: Quit the game
  • Space: Open doors
  • Arrow keys (Up/Down/Left/Right): Move character
  • Left mouse click: Shoot projectiles
  • Mouse movement: Adjust camera/view

๐Ÿงช Running Tests

for check map parsing :

./test_wrong_maps.sh

๐Ÿ‘ Acquired knowledge

  • โœ… Ray-casting: A technique used to create real-time 3D environments in games. It involves casting virtual rays from a player's perspective to determine what objects or walls are visible in the scene.

  • โœ… Manipulation of 3D graphics: Creating a realistic graphical representation of a maze using a subjective view. This includes rendering walls, floors, ceilings, and other objects to provide an immersive experience.

  • โœ… Utilization of the minilibX library: Using the minilibX library to develop simple graphical interfaces. This library provides functions for handling graphics, windows, and events in a minimalistic manner.

  • โœ… Reading configuration files (*.cub): Parsing configuration files to extract information about the maze's layout, textures, colors, and other parameters. These files define the characteristics of the game environment.

  • โœ… Mathematics and algorithms in ray-casting: The implementation of mathematical calculations and algorithms for ray-casting and 3D view calculations. This involves determining the intersections of rays with objects, calculating the distances, and rendering the scene accordingly.

  • โœ… Handling keyboard events: Managing keyboard input events to allow player movement within the maze. This includes detecting key presses, updating the player's position, and rendering the scene from the new perspective.

๐Ÿ˜Ž Team :

Fred, Jonathan