개요
cub3D는 DDA(Digital Differential Analyzer) 알고리즘을 사용한 Raycasting 엔진으로, 2D 맵을 3D로 렌더링한다. 플레이어는 1인칭 시점으로 맵을 탐험하며, 텍스처가 적용된 벽과 스프라이트를 볼 수 있다.
주요 기능
- Raycasting 렌더링: DDA 알고리즘을 사용한 효율적인 3D 렌더링
- 텍스처 지원:
- 벽 텍스처 (북, 남, 동, 서 4방향)
- 스프라이트 텍스처
- 플레이어 이동 및 회전: 부드러운 움직임과 시점 회전
- 맵 파싱:
.cub형식의 맵 파일 지원 - 스크린샷 기능:
--save옵션으로 BMP 형식 스크린샷 생성 - 충돌 감지: 벽과의 충돌 처리
- 동적 스프라이트 렌더링: 거리 기반 정렬 및 렌더링
빌드 방법
요구사항
- macOS (OpenGL 및 AppKit 프레임워크 필요)
- MLX 라이브러리 (42 스쿨 제공)
- GCC 컴파일러
- Make
빌드
make
실행 파일 cub3D가 생성된다.
정리
make clean # 오브젝트 파일 삭제
make fclean # 실행 파일 및 오브젝트 파일 삭제
make re # 완전히 재빌드
사용법
일반 실행
./cub3D <맵파일.cub>
예시:
./cub3D map1.cub
스크린샷 생성
./cub3D <맵파일.cub> --save
스크린샷은 screenshot.bmp 파일로 저장된다.
맵 파일 형식
.cub 파일은 다음 형식을 따른다:
해상도 설정
R <width> <height>
- 최소 해상도: 480x320
- 최대 해상도: 1024x768
텍스처 경로
NO <경로> # 북쪽 벽 텍스처
SO <경로> # 남쪽 벽 텍스처
WE <경로> # 서쪽 벽 텍스처
EA <경로> # 동쪽 벽 텍스처
S <경로> # 스프라이트 텍스처
색상 설정
F <R,G,B> # 바닥 색상 (RGB)
C <R,G,B> # 천장 색상 (RGB)
맵 그리드
0: 빈 공간 (이동 가능)1: 벽2: 스프라이트N,S,E,W: 플레이어 시작 위치 및 방향
예시 맵 파일
R 800 600
NO ./texture/wall_1.xpm
SO ./texture/wall_2.xpm
WE ./texture/wall_3.xpm
EA ./texture/wall_4.xpm
S ./texture/sprite_1.xpm
F 40,12,0
C 29,145,246
1 1 1 1 1
1 0 0 0 1
1 0 N 0 1
1 0 0 0 1
1 1 1 1 1
조작법
이동
- W / ↑: 앞으로 이동
- S / ↓: 뒤로 이동
회전
- A / ←: 왼쪽으로 회전
- D / →: 오른쪽으로 회전
종료
- ESC: 게임 종료
프로젝트 구조
cub3d/
├── include/ # 헤더 파일
│ ├── cub3d.h # 메인 헤더
│ ├── key.h # 키 입력 정의
│ └── libft.h # libft 헤더
├── srcs/ # 소스 파일
│ ├── main.c # 진입점
│ ├── init.c # 초기화
│ ├── set_cub3d.c # 맵 파싱
│ ├── raycasting.c # 레이캐스팅 알고리즘
│ ├── render.c # 렌더링
│ ├── player.c # 플레이어 이동/회전
│ ├── sprite.c # 스프라이트 관리
│ ├── texture.c # 텍스처 로딩
│ ├── screen.c # 화면 렌더링
│ ├── run_mlx.c # MLX 이벤트 루프
│ └── ...
├── lib/libft/ # libft 라이브러리
├── texture/ # 텍스처 파일 (.xpm)
├── map*.cub # 맵 파일 예시
└── Makefile # 빌드 설정
기술 스택
- 언어: C
- 그래픽 라이브러리: MLX (MiniLibX)
- 알고리즘: DDA Raycasting
- 빌드 시스템: Make
주요 알고리즘
Raycasting
- DDA (Digital Differential Analyzer) 알고리즘을 사용하여 각 픽셀마다 레이를 발사
- 벽과의 교차점을 계산하여 거리 측정
- 거리에 따라 벽의 높이를 계산하여 3D 효과 구현
스프라이트 렌더링
- 플레이어와의 거리를 계산하여 정렬
- 거리순으로 렌더링하여 올바른 깊이감 구현
참고사항
- 맵은 반드시 벽(
1)으로 둘러싸여 있어야 한다 - 플레이어 시작 위치(
N,S,E,W)는 맵에 정확히 하나만 있어야 한다 - 텍스처 파일은
.xpm형식이어야 한다 - 맵 파일의 설정 항목은 순서에 상관없이 배치할 수 있지만, 맵 그리드는 마지막에 위치해야 한다
라이선스
이 프로젝트는 42 스쿨의 교육 목적으로 제작되었다.