miniRT & cub3d에서 사용하게 되는 헤더파일이다.
mlx 라이브러리에 대한 번역본은 psj3205의 github에서 확인 할 수 있다.
mlx 라이브러리는 소프트웨어와 화면간의 연결을 해주는 라이브러리이다.
#include "mlx.h"
int main()
{
void *mlx_ptr;
void *win_ptr;
int width;
int heignt;
width = 400;
height = 400;
mlx_ptr = mlx_init(); //mlx 할당 실패할 경우 NULL반환
win_ptr = mlx_new_window(mlx_ptr, width, height, "Title");
// 할당된 mlx에 너비. 높이를 갖는 윈도우 창 생성.
mlx_loop(mlx_ptr);
}
위에 작성된 코드로 만든 윈도우는 터미널에서 코드를 종료시켜야 loop를 탈출할 수 있다.
mandatory 파트에 있는 내용 중 하나인 esc키를 이용해서 창을 종료 시켜보자.
mlx 헤더에 있는 기본 함수 중 mlx_hook을 이용하여 esc 키 입력을 확인하고 윈도우를 종료시키는 함수를 작성해봤다.
int mlx_hook(void *win_ptr, int x_event, int x_mask,
int (*funct)(), void *param);
mlx_hook 함수의 인자는 종료할 윈도우 창의 윈도우 첫 주소값이고 두번째 인자의 경우엔 이벤트의 종류인데 x.h에 정의되어있다. x_mask는 mac에서는 사용하지 않고 funct는 키값이 들어왔을때 실행할 함수이며 첫번째 인자로 입력된 Keycode 값이 들어간다. 마지막 param도 사용하지 않는다.
x_event
인자에 대한 정보는 여기에서 헤더데이터를 열어볼 수 있고 맥에서는 기본적으로 xcode가 설치되어있다면 불러올 수 있다고 하는데 나는 안된다. 웹상에서 x.h를 확인하고 필요한 인자들만 내 헤더파일에 따로 정의해주었다.
# define X_KEY_PRESS 2
# define X_KEY_RELEASE 3
X_KEY_PRESS는 키가 눌렸을때 바로 실행하는 것이고 X_KEY_RELEASE는 눌렀다가 뗄때 실행된다.
함수는 다음과 같이 사용하였으며
mlx_hook(vars.win, X_KEY_PRESS, 0, mlx_key_handle, 0);
여기서 사용한 mlx_key_handle는 다음과 같이 구성되어있다.
int exit_program(void)
{
exit(0);
return (0);
}
int mlx_key_handle(int keycode)
{
printf("keycode : %d\n", keycode);
if (keycode == 53)
return (exit_program());
return (0);
}
지금 함수에 들어있는 printf문을 사용하면 따로 검색하지않아도 esc키값이 무엇인지 알 수 있으며 esc의 키값인 53이 들어왔을때 exit_program을 실행하여 프로그램을 종료시킨다.