Cube3D es un proyecto de la escuela 42 que explora los fundamentos de la programación gráfica en C y el desarrollo de un motor de renderizado en 3D sencillo, inspirado en los clásicos juegos de tipo Wolfenstein 3D. El objetivo es crear una simulación de entorno 3D usando técnicas de raycasting, gestionando eventos de usuario y renderizando un mapa en perspectiva.
El programa simula un entorno tridimensional en primera persona, donde el usuario puede moverse por un mapa con paredes, espacios abiertos y objetos. Utiliza raycasting para calcular la proyección de paredes y renderizar la escena en tiempo real, permitiendo movimiento, rotación y detección de colisiones.
Entre los retos principales están el manejo de la entrada del usuario (teclado y ratón), la gestión eficiente de la memoria, y el renderizado de los elementos gráficos usando la librería MiniLibX.
- 🧭 Movimiento en el entorno: avanzar, retroceder, girar izquierda/derecha.
- 🖼️ Renderizado de paredes, suelo y techo en perspectiva 3D.
- 🧊 Soporte para texturas personalizadas en los muros.
- 🚪 Detección de colisiones para evitar atravesar paredes.
- 🖱️ Gestión de eventos del teclado y ratón.
- 🔄 Minimapa opcional para navegación visual.
- El mapa debe ser cerrado y sin fugas (no debe haber espacios abiertos que permitan salir del entorno).
- El jugador debe iniciar en una posición válida y orientado hacia una dirección.
- El programa debe manejar correctamente los errores de archivo y argumentos.
- No está permitido el uso de librerías gráficas externas, salvo MiniLibX.
- El código debe ser conforme a la Norma de 42 y seguir buenas prácticas de organización.
La versión bonus de Cube3D añade funcionalidades avanzadas para mejorar la experiencia de usuario y la jugabilidad:
- 🖱️ Rotación de cámara con el ratón: Ahora puedes girar la cámara suavemente a la izquierda o derecha simplemente moviendo el ratón, lo que facilita la exploración y añade una sensación más inmersiva de control en primera persona.
- 🚪 Interacción con puertas: Puedes abrir puertas dentro del mapa pulsando la tecla
E. Esto permite acceder a nuevas áreas, agregar elementos de puzzle y crear mapas más dinámicos y variados. - 🗺️ Minimapa interactivo: Se visualiza un minimapa en pantalla que representa la disposición del mapa y la posición actual del jugador. El minimapa facilita la navegación y el reconocimiento espacial, mostrando en tiempo real dónde te encuentras y hacia dónde te diriges.
Estas mejoras hacen que Cube3D sea más completo y dinámico, acercándose a la experiencia de los juegos clásicos pero con controles modernos y un entorno más interactivo.
Para compilar y ejecutar Cube3D, utiliza los siguientes comandos en tu terminal dentro del directorio del proyecto:
-
make all: Compila el proyecto y genera el ejecutablecub3D. -
make bonus: Compila el proyecto en modo bonus y genera el ejecutablecub3D. -
make clean: Elimina los archivos objeto (.o) generados durante la compilación. -
make fclean: Ejecuta el comandocleany elimina el ejecutable generado. -
make re: Ejecuta los comandosfcleanyall, recompilando todo el proyecto desde cero.
Una vez compilado, el proyecto se ejecuta con:
./cub3D <ruta_al_mapa.cub>El archivo de mapa (.cub) debe especificar:
- Texturas de paredes (N, S, E, W)
- Colores de suelo y techo
- Mapa en formato de caracteres (1: pared, 0: espacio, N/S/E/W: posición y orientación inicial del jugador)
Ejemplo de archivo .cub:
NO ./textures/north.xpm
SO ./textures/south.xpm
WE ./textures/west.xpm
EA ./textures/east.xpm
F 220,100,0
C 225,30,0
111111
100001
1020N1
100001
111111
./cub3D maps/mi_mapa.cubEsto abrirá la ventana de Cube3D y podrás moverte por el entorno 3D generado a partir del mapa.
El programa mostrará un mensaje de error si:
- ❌ El archivo de mapa no existe o tiene formato incorrecto.
- 🔢 Se especifica un número erróneo de argumentos.
- 📉 El mapa contiene valores no válidos, está abierto o hay posiciones iniciales inválidas.
- 🖼️ Las texturas o colores no están correctamente definidos.
Puedes ajustar opciones de compilación en el Makefile según tus necesidades, y modificar las texturas y colores del mapa para personalizar la experiencia visual.

