터미널에서 미니 게임을 구현해보자:)
dqQQQ
·2023. 11. 26. 19:25
개요
이 프로젝트는 작은 2D 게임을 만들어 보는 것이다.
게임에는 플레이어, 수집품, 출구가 있어야하고 수집품을 모두 모아 출구로 나가는 게임이다.
아래와 같이 만들면 된다.
나는 뚱이를 플레이어, 수집품은 햄버거, 출구는 스펀지밥의 집으로 했다.
과제를 해결하기 위한 사전지식
mlx.h
mlx는 스크린에 우리가 원하는 이미지를 띄울 수 있는 간단한 그래픽 라이브러리이다.
위의 홈페이지에 각각의 mlx 함수들의 자세한 설명이 있다.
파일 읽어서 파싱하는 법
문제에서 요구하는 것 중에 하나가 .ber
파일의 내용을 읽어서 처리를 하라는 것이다.
그렇다면 파일을 읽어서 버퍼에 저장을 해야한다. 이전에 수행했던 42과제중에 get_next_line 과제가 있는데 해당 코드를 약간 변형시키면 된다.
두개를 모두 공부하고 나서 막상 과제를 수행하는데에는 별로 시간이 들지 않았다.
MiniLibX
mlx라이브러리에는 많은 함수가 있지만 과제를 위한 함수는 많지 않다.
과제를 하면서 사용했던 함수들에 대해서 알아보겠다.
이 라이브러리는 Objective-C로 되어있는 것 같다.
void *mlx_init();
Parameter
void
Description
소프트웨어와 스크린을 연결해주는 함수
How to use
void *mlx_ptr;
mlx_ptr = mlx_init();
void *mlx_new_window(void *mlx_ptr, int size_x, int size_y, char *title);
Parameter
void *mlx_ptr
: 위에서 스크린을 연결하고 리턴받은 포인터int size_x
: 창의 가로 픽셀 개수int size_y
: 창의 세로 픽셀 개수char *title
: 창의 이름
Description
설정한대로 창을 생성하는 함수. 생성하면 검은 창을 띄운다.
How to use
void *win_ptr;
win_ptr = mlx_new_window(mlx_ptr, 900, 900, "");
나의 경우 뚱이 사진은 60 * 60 픽셀의 사진이다.
뚱이 사진을 표현할 수 있는 곳을 하나의 타일이라고 생각해보면 총 15개의 타일을 놓을 수 있게 설정했다.
그렇다면 뚱이 사진을 15 * 15개를 놓을 수 있는 창 하나가 생성된다.
int mlx_hook(void win_ptr, int X_EVENT, int x_mask, int (funct)(), void *param);
Parameter
void *win_ptr
: 위에서 창을 생성하고 리턴받은 포인터int X_EVENT
: 감지할 이벤트 코드int x_mask
: 맥에서는 사용하지 않는다.int (*funct)()
: 특정 이벤트를 감지했을 때 실행할 함수void *param
: 함수에 넘겨줄 파라메터
Description
X_EVENT의 코드를 감지하면 funct를 실행한다.
How to use
mlx_hook(win_ptr, 2, 0, &key_check, &game);
mlx_hook(win_ptr, 17, 0, &end_program, &game);
키보드 누르는 것을 감지하는 코드는 2이다. 만약 키가 눌리면 key_check함수가 실행된다. 이때 key_check함수는 어떤 키가 눌렸는지 알고 있다.
창을 종료하라는 이벤트를 감지하는 것은 17이다. 이 코드를 안쓰면 창은 없어지지만 프로그램이 종료되지 않는다.
int mlx_loop(void *mlx_ptr);
Parameter
void *mlx_ptr
: 위에서 스크린을 연결하고 리턴받은 포인터
Description
프로그램을 종료하지 않고 계속해서 띄워주는 함수
How to use
mlx_loop(game.mlx_ptr);
프로그램에 mlx_loop 함수가 실행되도록 하면 된다.
void *mlx_xpm_file_to_image(void *mlx_ptr, char *filename, int *width, int *height);
Parameter
void *mlx_ptr
: 위에서 스크린을 연결하고 리턴받은 포인터char *filename
: xpm 파일의 경로/이름int *width
: 이미지의 가로int *height
: 이미지의 세로
Description
xpm 형식의 파일을 불러와서 이미지로 변환 후 반환
How to use
void *img_ptr;
path = "./asset/player.xpm";
int img_width;
int img_height;
img_ptr = mlx_xpm_file_to_image(mlx_ptr, path, &img_width, &img_height);
width와 height는 따로 값을 지정해주지 않았는데 작동이 된다. 왤까
path는 내가 파일을 저장한 경로를 넣었다.
int mlx_put_image_to_window(void *mlx_ptr, void *win_ptr, void *img_ptr, int x, int y);
Parameter
void *mlx_ptr
: 위에서 스크린을 연결하고 리턴받은 포인터void *win_ptr
: 위에서 창을 생성하고 리턴받은 포인터void *img_ptr
: 위에서 이미지로 변환하고 리턴받은 포인터int x
: 이미지를 그려줄 x좌표int y
: 이미지를 그려줄 y좌표
Description
이미지를 원하는 위치에 그려주는 함수
How to use
mlx_put_image_to_window(mlx_ptr, win_ptr, img_ptr, row, col);
예를 들어 row가 300, col이 300이면 아까의 900 * 900 의 창에서 300 * 300위치에 이미지 전체를 그려준다.
My Solong
구조는 위의 사진과 같다.
'42Seoul' 카테고리의 다른 글
환경변수에 대해서 알아보자:) (0) | 2023.11.26 |
---|---|
정렬된 스택을 만들기 위한 명령어들을 만들어보자:) (0) | 2023.11.26 |
터미널에서 미니 대화창을 구현해보자:) (0) | 2023.11.26 |
가변인자와 printf 함수의 형식지정자에 대해서 알아보자:) (0) | 2023.11.26 |
도커를 공부해보자:) (0) | 2023.11.26 |