Solong

개요

이 프로젝트는 작은 2D 게임을 만들어 보는 것이다.

게임에는 플레이어, 수집품, 출구가 있어야하고 수집품을 모두 모아 출구로 나가는 게임이다.

아래와 같이 만들면 된다.

나는 뚱이를 플레이어, 수집품은 햄버거, 출구는 스펀지밥의 집으로 했다.




과제를 해결하기 위한 사전지식


mlx.h

mlx는 스크린에 우리가 원하는 이미지를 띄울 수 있는 간단한 그래픽 라이브러리이다.

위의 홈페이지에 각각의 mlx 함수들의 자세한 설명이 있다.


파일 읽어서 파싱하는 법

문제에서 요구하는 것 중에 하나가 .ber파일의 내용을 읽어서 처리를 하라는 것이다.

그렇다면 파일을 읽어서 버퍼에 저장을 해야한다. 이전에 수행했던 42과제중에 get_next_line 과제가 있는데 해당 코드를 약간 변형시키면 된다.

두개를 모두 공부하고 나서 막상 과제를 수행하는데에는 별로 시간이 들지 않았다.




MiniLibX


mlx라이브러리에는 많은 함수가 있지만 과제를 위한 함수는 많지 않다.

과제를 하면서 사용했던 함수들에 대해서 알아보겠다.

이 라이브러리는 Objective-C로 되어있는 것 같다.

void *mlx_init();


Parameter

  • void

Description

소프트웨어와 스크린을 연결해주는 함수

How to use

1
2
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

1
2
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

1
2
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

1
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

1
2
3
4
5
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

1
mlx_put_image_to_window(mlx_ptr, win_ptr, img_ptr, row, col);

예를 들어 row가 300, col이 300이면 아까의 900 * 900 의 창에서 300 * 300위치에 이미지 전체를 그려준다.




My Solong


구조는 위의 사진과 같다.