cub3D

hhkim·2022년 7월 25일
0

42cursus

목록 보기
19/20
post-thumbnail

서브젝트

  • .cub 확장자 맵 파일을 인자로 받는 프로그램 cub3D
  • 천장과 바닥은 서로 다른 색으로 칠할 것
  • 왼쪽, 오른쪽 화살표로 플레이어 시점 변경 (회전)
  • W, A, S, D로 플레이어 위치 변경
  • ESC를 누르면 프로그램을 깨끗하게 종료
  • 창닫기 버튼을 누르면 프로그램을 깨끗하게 종료
  • minilibX의 images를 사용할 것!

사용 가능 함수

  • open, close, read, write, printf, malloc, free, perror, strerror, exit
  • math 라이브러리의 모든 함수
  • MinilibX의 모든 함수

맵 파일

  • 0: 빈 공간
  • 1: 벽
  • N S E W: 시작 시 플레이어가 바라보는 방향
  • 맵은 벽으로 둘러싸여 있어야 함
    그렇지 않으면 에러 리턴
  • 맵 자체를 제외하고 다른 내용들은 하나 이상의 빈 줄로 분리
  • 가장 마지막에 위치하는 맵 자체를 제외하고 다른 요소들은 순서 상관 없음
  • 맵 자체를 제외하고 각 요소의 정보들은 하나 이상의 스페이스로 분리
  • 맵에 스페이스가 포함될 수 있고 처리는 마음대로
  • 문제를 만나면 Error\n와 커스텀 에러 메시지 출력하고 종료

요소

  • 가장 먼저 타입 식별자(하나 또는 두 글자의 문자)
  • 그 다음으로 필요한 정보들이 순서대로 옴
  • 벽 텍스쳐 (NO ./path_to_the_north_texture)
    • 북: NO
    • 남: SO
    • 서: WE
    • 동: EA
  • 벽과 바닥 색상 (F 220,100,0 - RGB 색상)
    • 바닥: F
    • 천장: C

예시

NO ./path_to_the_north_texture
SO ./path_to_the_south_texture
WE ./path_to_the_west_texture
EA ./path_to_the_east_texture

F 220,100,0
C 225,30,0

	1111111111111111111111111
	1000000000110000000000001
	1011000001110000000000001
	1001000000000000000000001
111111111011000001110000000000001
100000000011000001110111111111111
11110111111111011100000010001
11110111111111011101010010001
11000000110101011100000010001
10000000000000001100000010001
10000000000000001101010010001
11000001110101011111011110N0111
11110111 1110101 101111010001
11111111 1111111 111111111111

구현

파싱

  1. 파일 열기
  2. GNL로 한 줄 씩 읽기
  3. 각 줄이 유효한지 확인
  4. 앞 문자를 기준으로 타입 확인
  5. 타입이 방향이면 파일 경로가 유효한지 확인하고 저장
    (존재하는 파일인지 확인)
    타입이 천장이나 바닥이면 색상이 유효한지 확인하고 저장
    (, 2개로 분리된 숫자들인지, 각각이 0~255 사이인지)
    (색상은 int로 저장해야 하기 때문에 비트 연산으로 8비트씩 밀어준다고 함 - 앞에서부터 8비트씩 aRGB)
  6. 4~5가 끝나면 앞 문자가 공백을 제외하고 0이나 1이면 맵 시작
  7. 맵이 시작되었는데 이전의 정보 중 하나라도 빠졌으면 에러
    그렇지 않으면 맵 유효성 확인
    👉 유효한 문자만 있는지 확인, 방향을 나타내는 문자가 하나인지 확인하고 저장, 가장 긴 가로 세로 길이(맵 크기) 저장, 맵 파일에서 맵이 시작하는 위치 저장
  8. GNL 끝, 파일 닫기
  9. 맵 배열 저장
    (배열 크기만큼 2차원 배열 메모리 할당, 파일 다시 열고 GNL 실행하면서 값 저장)
    (가로 길이가 각각 다를 수 있기 때문에 미리 스페이스로 채워두기)
  10. 맵이 벽에 둘러싸여 있는지 확인
    (0이 나왔을 때 그 위치에 따라 확인)
    👉 맨앞, 맨뒤, 맨위, 맨아래 안 됨
    주변 중 하나라도 스페이스면 안 됨
    (이때 검사할 인덱스가 접근 가능한지 미리 확인해야 함!)
  11. 플레이어 위치 확인하고 저장

참고

수학

레이 캐스팅

mlx

  • M1칩에서 mlx 실행하기
    : interface.swift의 273번째 줄 코드를 아래와 같이 변경
CGAssociateMouseAndMouseCursorPosition(UInt32(1))
👇
CGAssociateMouseAndMouseCursorPosition(boolean_t(1))

0개의 댓글