[42Seoul] cub3d description 파일 파싱하기 1

seomoon·2021년 1월 14일
2

42Seoul

목록 보기
3/9

1) cub3d subject - description file 처리

description 파일을 어떻게 처리해야할지 조금 막막해서 서브젝트에서 해당 부분을 다시 읽어봤다. (아래는 번역한 내용. 오역이 있을 수 있음)

  • cub3d 프로그램은 첫번째 인자로 description 파일을 받아와야 한다. (.cub 확장자)

  • 맵은 0(빈 공간), 1(벽), 2(아이템), N/S/E/W(플레이어의 위치 및 방향), 4가지 문자로만
    이루어져 있어야 한다.

  • 맵은 벽으로 둘러싸여 있어야 한다. 그렇지 않으면 프로그램은 에러를 리턴해야한다.

  • description 파일에서 맵을 제외한 나머지 요소들은 한 줄 이상의 empty line으로 구분되어 있을 수 있다.

  • 맵은 항상 파일의 가장 하단에 있고, 그 외의 요소들은 배치 순서가 정해져있지 않다.

  • 맵을 제외한 나머지 요소들의 information은 한 칸 이상의 공백으로 구분되어 있을 수 있다.

  • 맵은 파일에서 보여지는 대로 파싱되어야 한다. 공백도 맵에서 유효한 부분이며,
    공백을 어떻게 처리할지는 자유롭게 선택할 수 있다.

  • 룰을 지킨 맵이라면 어떤 형태이든 파싱할 수 있어야 한다.

  • 맵을 제외한 요소들의 첫번째 information은 type identifier이다. (한 개 혹은 두 개의 문자로 구성)

  • 다음과 같은 순서로 information들이 나열된다.

    • Resolution (화면 해상도) :
      R 1920 1080
      identifier / x render size / y render size
    • Texture (North, South, West, East 방향 텍스처) :
      NO/SO/WE/EA ./path_to_the nort_texture
    • Sprite texture :
      S ./path_to_the_sprite_texture
    • Floor color :
      F 220,100,0 identifier / RGB colors in range
    • Ceiling color :
      C 225,30,0
      identifier / RGC colors in range
  • 만약 파일에 잘못된 설정이 존재하는 경우, 프로그램은 반드시 적절하게 종료되고 에러 메세지를 출력해야 한다.
    에러 메세지는 “Error\n” 뒤에 구체적인 에러메세지를 작성해서 출력하면 된다.
    뒤에 올 메세지는 자유롭게 작성할 수 있다.

2) description 처리 과정 생각해보기

코드를 작성하기 전에 description 파일 처리를 어떻게 할지
간단히 정리해봤다.

  1. main 함수에서 description 파일 인자로 받아오기

  2. 파일 유효성 검사하기

  3. information 파싱 & 저장하기 (configuration)

    • 파일/information 형식이 잘못된 경우 에러 리턴하고 종료
  4. 맵 유효성 검사하기

    • 맵이 잘못된 경우 에러 리턴하고 종료
  5. 맵 파싱 & 저장하기

  6. 레이캐스팅으로 맵 렌더링하기

    • --save 옵션이 있는 경우 렌더링 된 이미지를 bmp 파일로 저장하고 종료하기
    • --save 옵션이 없는 경우 mlx로 창 띄워서 렌더링하기
    • 유저의 키/마우스 입력받고 처리하기

+) description 파일 한 줄씩 읽는 과정은 이전에 과제로 제출한 get_next_line 함수로 처리하면 될 것 같다

3) description 처리 함수 작성하기

(완성본 X. 컴파일이 안 될수도 있고 로직이 틀렸을 수도 있으니 참고만 하기)

treat_description()

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);
}

변수

  • info 구조체는 cub3d의 모든 구조체와 information들을 저장하는 구조체이다.
  • gnl_return 변수는 get_next_line() 함수의 리턴값을 저장하는 변수이다.

예외처리

  • 먼저 check_file_name() 변수를 호출해 description file의 이름 형식이 맞는지 확인한다.
    파일명이 존재하지 않거나(NULL), 파일 형식이 잘못되었으면(파일명이 .cub로 끝나야함) -1을 리턴한다.
  • 파일 open에 실패하면 -1을 리턴한다.

메인 로직

  • while문에서 get_next_line() 함수를 호출해 디스크립션 파일을 한 줄씩 읽어온다.
  • 읽어온 문자열은 line이라는 변수에 저장한다.
  • line을 parse_line() 함수로 넘겨 파싱한다.
  • 파싱이 끝난 line은 메모리에서 해제한다.
profile
💛💛 🖥🏐🛋🥗💵📖 💛💛

0개의 댓글