[cub3d] 과제 정리

SonHero·2022년 6월 18일
0

42cursus

목록 보기
3/5
post-thumbnail

cub3D는 .cub파일을 받아서 3D 게임화하는 프로그램이다.

우리는 cub파일을 파싱하는 파싱 담당, 맵 파일을 3D로 띄우는 레이캐스팅 담당으로 나누어서 작업을 진행했다.

내가 맡은 부분인 파싱에 대해서 집중적으로 이야기하려고 한다.

파싱 부분

파싱의 전체적인 흐름은 gnl로 파일을 한 줄씩 읽으면서, 해당 줄이 어떤 값을 담고 있는지 확인한다. SO, NO, EA, WE 등 벽 텍스처를 담당하는 부분이 있고, F, C처럼 rgb값을 담고 있는 부분도 있다. 그리고 그 외의 맵을 표현하는 부분도 존재한다.
우리는 키워드를 읽고, 이후에 오는 값을 맞춰서 처리해야 한다. 이때 split을 사용해서 값을 처리했다.

텍스처와 rgb값이 모두 나왔다면, 우리는 맵 값을 처리해야 한다. 서브젝트에서 주어진 맵의 규칙을 맞추도록 로직을 짜야 한다. 전체적으로 파싱 부분은 비슷하지만, 나는 맵을 처음 읽을 때 리스트를 사용했다.
리스트를 사용해서 각 줄마다 노드별로 구분해서 리스트화 하였다. 이후 모두 받았다면, 리스트를 이차원 배열로 바꾸었다. 이렇게 하는 이유는 맵의 전체 크기를 모르기 때문에 리스트로 먼저 맵 데이터를 받아온 뒤 맵의 가로, 세로 길이를 구한다. 그리고 이차원 배열을 할당하는 방법으로 진행했다.

이후 맵의 유효성 검사는, 플레이어의 개수나, 맵 요소 중 잘못된 요소가 있는지 확인한다. 그리고 맵이 벽으로 덮여 있는지 확인하는 작업이 필요하다.

맵이 벽으로 덮여있는지 확인하는 방법이 여기서 나뉘는데,
(1) 0이나 플레이어의 상하좌우를 검사해서 벽으로 덮여있는지 확인하는 방법이 있다.
(2) dfs를 사용해서 벽을 검사하는 방법이 있다.

각 방법마다 장단점이 존재한다. (1)은 코드 짜기가 쉽다는 점이다. 그러나,
(1)의 방법을 사용하면 위의 맵은 에러로 처리된다. 0이 벽 안에 있는지 검사하는 과정에서 바깥의 0이 에러로 처리되기 때문이다.
반대로 (2)는 코드 짜기가 (1)에 비해서 어렵지만, 위의 맵은 올바른 맵으로 처리한다는 것이다.

이 부분은 카뎃끼리도 의견이 나뉘는 주제이다. 이것은 일관성 있게 코드를 짜고 디펜스를 하면 되는 부분인 것 같다. 참고로 나는 (1)번 방법을 사용했다.

어쨌든 둘 중 하나의 방법을 사용해서 맵의 유효성을 검사하면 파싱 부분은 끝이다.

레이캐스팅

레이캐스팅은 내가 맡은 부분이 아니라서 자세히 이야기할 순 없지만, lodev의 레이캐스팅 문서를 번역한 문서를 찾아보면 편할 것이다.

cub3d를 처음 봤을 때 레이캐스팅이 어려울 것 같았지만, 오히려 레이캐스팅에 대한 정보가 많아서 생각한 만큼 어렵진 않았던 것 같다. 같이 한 팀원 분은 오히려 레이캐스팅 부분이 파싱보다 쉽다고 이야기했다. 그래도 파싱도 (1) 방법을 사용하면 충분히 할만하다고 생각한다.

profile
개발하는 학생입니다.

0개의 댓글