ecole42

cub3d

cub3d는 ecole42의 프로젝트로, DDA(Digital Differential Analyzer) 알고리즘을 사용한 Raycasting 엔진으로 2D 맵을 3D로 렌더링하는 프로젝트. MLX 라이브러리를 활용하여 텍스처가 적용된 벽과 스프라이트를 렌더링하고, 플레이어가 1인칭 시점으로 맵을 탐험할 수 있는 게임 엔진을 구현한다. 이를 통해 그래픽 프로그래밍, 수학적 알고리즘, 게임 엔진 구조 등 컴퓨터 그래픽스의 핵심 개념을 학습한다

C

개요

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 스쿨의 교육 목적으로 제작되었다.

참고자료