description 파일을 어떻게 처리해야할지 조금 막막해서 서브젝트에서 해당 부분을 다시 읽어봤다. (아래는 번역한 내용. 오역이 있을 수 있음)
cub3d 프로그램은 첫번째 인자로 description 파일을 받아와야 한다. (.cub 확장자)
맵은 0(빈 공간), 1(벽), 2(아이템), N/S/E/W(플레이어의 위치 및 방향), 4가지 문자로만
이루어져 있어야 한다.
맵은 벽으로 둘러싸여 있어야 한다. 그렇지 않으면 프로그램은 에러를 리턴해야한다.
description 파일에서 맵을 제외한 나머지 요소들은 한 줄 이상의 empty line으로 구분되어 있을 수 있다.
맵은 항상 파일의 가장 하단에 있고, 그 외의 요소들은 배치 순서가 정해져있지 않다.
맵을 제외한 나머지 요소들의 information은 한 칸 이상의 공백으로 구분되어 있을 수 있다.
맵은 파일에서 보여지는 대로 파싱되어야 한다. 공백도 맵에서 유효한 부분이며,
공백을 어떻게 처리할지는 자유롭게 선택할 수 있다.
룰을 지킨 맵이라면 어떤 형태이든 파싱할 수 있어야 한다.
맵을 제외한 요소들의 첫번째 information은 type identifier이다. (한 개 혹은 두 개의 문자로 구성)
다음과 같은 순서로 information들이 나열된다.
만약 파일에 잘못된 설정이 존재하는 경우, 프로그램은 반드시 적절하게 종료되고 에러 메세지를 출력해야 한다.
에러 메세지는 “Error\n” 뒤에 구체적인 에러메세지를 작성해서 출력하면 된다.
뒤에 올 메세지는 자유롭게 작성할 수 있다.
코드를 작성하기 전에 description 파일 처리를 어떻게 할지
간단히 정리해봤다.
main 함수에서 description 파일 인자로 받아오기
파일 유효성 검사하기
information 파싱 & 저장하기 (configuration)
맵 유효성 검사하기
맵 파싱 & 저장하기
레이캐스팅으로 맵 렌더링하기
--save
옵션이 있는 경우 렌더링 된 이미지를 bmp 파일로 저장하고 종료하기--save
옵션이 없는 경우 mlx로 창 띄워서 렌더링하기+) description 파일 한 줄씩 읽는 과정은 이전에 과제로 제출한 get_next_line 함수로 처리하면 될 것 같다
(완성본 X. 컴파일이 안 될수도 있고 로직이 틀렸을 수도 있으니 참고만 하기)
int treat_description(char *file_name, t_info *info)
{
int fd;
int gnl_return;
if (!check_file_name(file_name))
return (-1);
if (!(fd = open(file_name, O_RDONLY)))
return (-1);
while ((gnl_return = get_next_line(fd, &line)) >= 0)
{
parse_line(line, info, gnl_return);
free(line);
}
close(fd);
return (1);
}
변수
예외처리
메인 로직