
설명에 들어가기 전 후기
본과정에 오고나서 처음으로 평가를 해본 과제여서 그런지 여러 그래픽 과제 중에서도 so long을 제일 하고 싶었다.
특히 원하는 캐릭터와 이미지를 가지고 간단한 게임을 만든다는 것이 흥미로웠다.
이 프로그램을 만들기 위해서 어떠한 과정을 거치고, 어떤 코드가 필요한 지 머리 속에 착착 그려져서 구현하는데는 어렵지 않았다.
다만 맵을 저장하는 과정에 있어 연결리스트로 맵을 저장하였는데, 연결리스트를 잘 다루지 못하여서 꼬박 하루가 넘게 연결리스트 저장에만 시간을 쏟았다.
이차원 배열을 가지고 구현했다는 동료의 말을 듣고, 이차원 배열로 갈아탈까 생각했지만 이미 연결리스트를 통해 구현한 터라 계속 진행하고 싶었다.
하지만 저장된 맵의 상하좌우를 다 검사하는 과정에서 연결리스트가 이차원 배열보다 훨씬 더 비효율적이라 생각하여 갈아엎게 되었다.
get next line을 통해 leaks에 대해 배운터라 malloc을 하면 사용한 뒤에 바로바로 free를 해주고, lldb를 사용하여 leaks 체크를 하였기에 메모리 누수없는 깔끔한 코드를 만들 수 있었다.
mlx 사용법을 익히는 데는 많은 시간이 걸리지 않았지만, 실수로 mlx_init()을 2번 하는 바람에 leaks가 나게 되었다.
또한 mms 버전을 쓰다보니 화면 중간에 검은 선이 나타나는 버그가 생겼는데 opengl을 사용하여서 해결하였다.
가장 많은 시간을 쏟은건 Makefile 부분이었다.
이미 만들어놓은 라이브러리를 사용하기 위해 해당 라이브러리의 Makefile을 통해 컴파일 하고, 그 컴파일 된 라이브러리를 가지고 본 코드를 make하는 부분, 즉 Makefile을 여러개 사용하는 부분이 가장 오래 걸리고 어려웠다.
so long을 진행하면서 많은 동료들의 도움을 받았고, 위에 서술한 문제들을 해결할 수 있었다. 다들 감사합니다:)
프로젝트 소개
간단한 2D 게임 만들기
아이템을 먹어야 출구로 탈출 할 수 있는 게임
MLX
mlx는 MiniLibX라고하며, 창(window)제어와 그래픽 작업을 위해 42학생들에게 제공되는 라이브러리
컴파일 방법
gcc -lmlx -framework OpenGl -framework Appkit 소스파일.c
함수
mlx 초기화 함수
void *mlx_init();
mlx 사용을 위해 가장 먼저 사용
나의 소프트웨어와 디스플레이 연결
창 생성 함수
void *mlx_new_window(void *mlx_ptr, int size_x, int size_y, char *title);
mlx을 통해 창을 생성
창 종료 함수
int mlx_destroy_window(void *mlx_ptr, void *win_ptr);
생성된 창을 종료
xpm을 사용하여 이미지 생성 함수
void *mlx_xpm_to_image(void *mlx_ptr, char **xpm_data, int *width, int *height);
xpm 파일을 mlx에서 사용할 수 있는 이미지로 생성
이미지 출력 함수
int mlx_put_image_to_window(void *mlx_ptr, void *win_ptr, void *img_ptr, int x, int y);
원하는 이미지를 원하는 위치에 생성
이벤트 대기 함수
int mlx_loop(void *mlx_ptr);
키보드나 마우스로부터 받은 이벤트를 기다리는 무한 루프 함수
이벤트 작동 함수
//키보드
int mlx_key_hook(void *win_ptr, int (*funct_ptr)(), void *param);
//마우스
int mlx_mouse_hook(void *win_ptr, int (*funct_ptr)(), void *param);
//expose
int mlx_expose_hook(void *win_ptr, int (*funct_ptr)(), void *param);
이벤트가 발생하면 원하는 함수를 호출
Makefile
리눅스에서 라이브러리는 반드시 lib로 시작되며, 옵션에 라이브러리 이름을 적을때 lib와 확장자를 생략하고 작성
ex) libft.a -> ft
GCC 옵션
-I (대문자 i) : 헤더 파일을 탐색할 디렉토리
-L : 라이브러리 위치가 있는 디렉토리
-l (소문자 L) : 라이브러리 명시
lldb 사용법
방법 1
1. 프로그램을 컴파일 시 -g 옵션과 함께 컴파일
2. lldb [프로그램 이름] 실행
3. r을 실행 후, 나오는 프로세스 번호를 기억
4. 다른 터미널에서 while true; do leaks [프로세스 번호]; sleep 0.5; done 실행
방법 2
main의 return(0); 위에 System("leaks [프로그램 이름]); 실행
동작 순서
1. 필요한 데이터를 모두 0으로 초기화
2. GNL을 사용하여 맵을 모두 한 줄로 read
3. 맵을 read하며 구성요소 및 맵의 유효성 검사를 진행
4. 한 줄로 읽은 맵을 split을 사용해 \n을 기준으로 분할하여 맵을 이중 배열로 저장
5. mlx 관련 초기화 진행
6. 맵에 따라 해당하는 이미지 출력
7. 키보드 이벤트가 발생시, 현재 플레이어의 위치에서 이동이 가능한지 확인(벽 검사, 현재 아이템의 개수에 따른 문 통과 검사)한 후 이동
8. expose이벤트 혹은, 게임이 끝나면 할당된 맵을 free후 종료
'42 Seoul' 카테고리의 다른 글
[42 Seoul] push swap (0) | 2023.02.24 |
---|---|
[42 Seoul] minitalk (0) | 2023.01.05 |
[42 Seoul] get_next_line (0) | 2022.09.22 |
[42 Seoul] Born2beroot - Bonus (0) | 2022.09.06 |
[42 Seoul] Born2beroot - sudo, ufw, ssh, cron (0) | 2022.09.05 |