Este projeto foi criado como parte do currículo da 42 por dapinhei, ranhaia-
Implementação de um motor gráfico simples em C baseado em raycasting, inspirado em jogos como Wolfenstein 3D. O projeto foi desenvolvido utilizando a MiniLibX, com foco em parsing robusto, validação de mapa e gerenciamento correto de memória.
Renderizar um ambiente 3D a partir de um mapa 2D (.cub), permitindo movimentação do jogador, colisão com paredes e interação básica.
- Flood fill (verificação de mapa fechado)
- Gerenciamento manual de memória
- Manipulação de eventos (teclado e mouse)
-
Linguagem: C
-
Biblioteca gráfica: MiniLibX
-
Sistema: Linux
-
Ferramentas:
- Valgrind (análise de memória)
- Norminette (padronização de código)
- Raycasting (projeção 3D a partir de mapa 2D)
- Parsing de arquivos
- Validação estrutural de dados
- Flood fill (verificação de mapa fechado)
- Gerenciamento manual de memória
- Manipulação de eventos (teclado e mouse)
.
├── includes/
│ ├── mlx/
│ ├── libft/
│ └── get_next_line/
└── maps/
├── parse/
│ ├── parse_color.c
│ ├── parse_extension.c
│ ├── parse_map.c
│ ├── parse_player.c
│ ├── parse_texture.c
│ ├── parse_utils.c
│ ├── parse_utils2.c
│ └── parse.c
│ ├── validate_map.c
├── cub3d.h
├── draw_utils.c
├── init.c
├── key.c
├── main_bonus.c
├── main.c
├── map.c
├── mlx_utils.c
├── raycasting_utils.c
├── raycasting.c
├── render_lantern.c
├── textures.c
O arquivo .cub contém:
NO ./path_to_texture
SO ./path_to_texture
WE ./path_to_texture
EA ./path_to_texture
F 220,100,0
C 225,30,0
111111
100001
10N001
111111
O parser foi dividido em duas etapas:
- Identificação de linhas de textura, cor e mapa
- Armazenamento dinâmico das linhas
- Cálculo de dimensões (
width,height) - Normalização do mapa (retangular)
- Validação de caracteres
- Verificação de player único
- Flood fill para garantir mapa fechado
O projeto utiliza flood fill a partir da posição do jogador:
-
Se atingir:
- borda do mapa
- espaços (
' ') → o mapa é considerado inválido
Isso evita:
- vazamentos
- mapas abertos
- buracos internos
| Tecla | Ação |
|---|---|
| W / S | Frente / trás |
| A / D | Strafe |
| ← / → | Rotação |
| Mouse | Rotação (bonus) |
| F | Interação |
| ESC | Sair |
Para cada coluna da tela:
- Um raio é lançado no mapa
- Calcula interseções horizontais e verticais
- Determina a distância até a parede
- Corrige efeito de distorção (fish-eye)
- Renderiza a parede com textura
- Todos os caminhos de erro possuem liberação adequada
error_exit_parsergarante cleanup completo- Testado com Valgrind
Resultado:
All heap blocks were freed -- no leaks are possible
make
make bonus./cub3D maps/map.cub- Mapas válidos e inválidos
- Casos de erro no parser
- Validação estrutural do mapa
- Análise de memória com Valgrind
- Não possui sistema avançado de iluminação
- Performance não otimizada para mapas grandes
O projeto cumpre os requisitos do cub3D com:
- Parser robusto e seguro
- Validação completa de mapa
- Renderização funcional em tempo real
- Gerenciamento correto de memória
- Lode's Computer Graphics Tutorial (Raycasting)
- Permadi Raycasting Tutorial
- Documentação da MiniLibX
- Subject do cub3D (42 School)
- Man pages do Linux
A IA foi utilizada como ferramenta de apoio durante o desenvolvimento, auxiliando principalmente em:
- Correção de bugs, indicando possíveis pontos de falha na lógica
- Revisão de código, sugerindo melhorias em trechos repetitivos
- Apoio na identificação de problemas de implementação
Todas as decisões finais, implementação e entendimento do código foram realizados manualmente.
--- Autores ---
Danilo Pinheiro
Renato Anhaia Flud Pacheco