so_long의 기록들

정하나둘·2022년 12월 25일
0

so_long

목록 보기
1/2

Minilibx란?

minilibx는 화면에서 무언가를 그리기 위한 기본적인 그래픽 라이브러리이다.
간단한 창 생성, 그리기 도구, 이미지 기능 및 이벤트 관리 시스템을 제공한다.
C언어 환경에서 사용하기 위해 <mlx.h> 헤더를 추가해야 한다.

컴파일을 하기 위해서 일련의 처리가 필요하다.

  • 설정되어 있는 헤더 디렉토리에서 자동으로 찾는 방법.
    gcc -Lmlx -lmlx -framework OpenGL -framework Appkit -Imlx
  • 라이브러리 경로를 직접 지정하는 방법.
    cc -L/(라이브러리 경로) -Lmlx -lmlx -framework OpenGL -framework Appkit -Imlx
    만약 해당 경로에 라이브러리가 존재하지 않는다면 내장 라이브러리에서 찾는다.

예제

mlx_init -> 초기화

#include <mlx.h>

int main(void)
{
	void	*mlx_ptr;
    
    mlx_ptr = mlx_init();
    return (0);
}

mlx.h 파일에 선언되어 있는 mlx_init함수를 활용해서 포인터를 초기화 할 수 있는데, mlx_ptr은 mlx_init() 함수가 리턴하는 mlx 구조체의 주소를 가리키게 된다.




mlx_new_window ->화면 띄우기

함수 원형

void *mlx_new_window(void *mlx_ptr, int size_x, int size_y, char *title);
#include <mlx.h>

int main()
{
	void	*mlx_ptr;
	void	*win_ptr; // 생성할 윈도우를 가리키는 포인터
	
	mlx_ptr = mlx_init();	
	win_ptr = mlx_new_window(mlx_ptr, 500, 500, "Hellow World!"); 
	mlx_loop(mlx_ptr); // loop를 돌면서 event를 기다리고, 생성한 윈도우를 Rendering한다. 
	return (0);
}

함수 인자

size_x는 만들려는 window의 width, size_y는 height를 의미한다. title로 주어지는 문자열은 window의 제목으로 나타난다. mlx_ptr은 mlx_init 함수로부터 반환받은 구조체의 주소이며 mlx_ptr로 지칭되는 연결에 해당하는 window를 만들기 위해 이용된다.

화면에 빈 모니터를 띄울 수 있다.

  • 만약 초기화 하지 않은 mlx_ptr이 mlx_new_window 함수로 전달된다면 segfault를 발생한다.
  • 이 함수는 창을 생성하는 것 까지만 작동하고 실제로 모니터상에 창을 띄우지 않는다. mlx_loop 함수를 주석처리하면 실행 시 아무것도 보이지 않는다.




mlx_xpm_file_to_image

함수 원형

void * mlx_xpm_file_to_image(void *mlx_ptr, char *filename, int *width, int *height);

메모리에 새로운 이미지를 생성한다. 이때, new_image는 빈 이미지이고, mlx_xpm_file_to_image는 xpm파일을 메모리에 생성하는 것이다.

함수 인자

  • mlx_ptr : 연결 식별자(mlx_init 리턴값)
  • filename : image로 만들 xpm 파일 이름
  • width, height : xpm 파일의 가로, 세로 길이

반환값

이미지 식별자로 null이 아닌 포인터를 반환한다. 실패시 NULL 반환.




mlx_hook()

함수 원형

int	mlx_hook(void *win_ptr, int x_event, int x_mask, int (*funct)(), void *param);

mlx_hook 함수를 사용하면 액션에 따른 값을 2번째 매개변수인 x_event로 받을 수가 있다.
즉, x_event에 2를 넣으면 키를 눌렀을 때 동작을 hook함수의 4번째 인자인 함수가 동작하는 그런 식이다.
02: KeyPress
03: KeyRelease
04: ButtonPress
05: ButtonRelease

3번째 인자인 x_mask는 Mac OS X에서 Mask 값이 사용되지 않기 때문에 x_mask 값을 0으로 지정하여 사용하지 않는 인자임을 암시하도록 하여도 내부적으로는 사용하지 않아 동작에는 지장이 없다.




mlx_loop_hook()

함수 원형

int mlx_loop_hook(void *mlx_ptr, int (*funct_ptr)(), void *param)

아무 이벤트도 일어나지 않을 경우 인자로 받았던 함수가 호출된다.
이벤트 발생 조건 없이 (*funct_ptr)()에 매개변수로 입력된 함수를 무한대로 실행한다. (주의. 진짜 속도가 너무 빨라서 so_long에서 사용할때는 속도를 지연시켜야 한다. 해당 방법은 다른 문서에서 기술 예정)

함수 인자

mlx_ptr : 윈도우 식별자(mlx_new_window 리턴값)
(
funct_ptr)() : 호출할 함수의 주소(포인터)
*param : 호출한 함수 내에서 필요한 파라미터 데이터의 주소값




mlx_loop()

함수 원형

int mlx_loop(void *mlx_ptr)

그래픽 시스템은 양방향이다. 한쪽에서는 스크린에 디스플레이할 픽셀, 이미지 등을 명령하고, 한쪽에서는 키보드나 마우스로부터 "이벤트"를 받는다.
이때 이벤트를 수신하는 함수이다. 이벤트를 기다린 다음 이 이벤트와 관련된 사용자 정의 함수를 호출하는 무한 루프이다.

다음 세 가지 이벤트에 다른 기능을 할당할 수 있다.

  • 키를 누를 때 (mlx_key_hook)
  • 마우스 버튼을 누를 때 (mlx_mouse_hook)
  • 창의 일부를 다시 그려야 할 때 (이를 "expose" 이벤트라고 하며 이를 처리하는 것은 프로그램의 작업이다.) (mlx_expose_hook)

mlx_key_hook과 mlx_mouse_hook은 해당 문제에서 필자가 사용하지만 mlx_expose_hook은 사용하지 않으므로 특별히 기술하지 않기로 결정했다.

-> 무한루프이므로 함수 마지막에 쓰여야 한다.




mlx_destroy_window

함수 원형

int mlx_destroy_window(void *mlx_ptr, void *win_ptr)

지정된 window를 끈다.

인자
mlx_ptr : 연결 식별자(mlx_init 리턴값)
win_ptr : 윈도우 식별자 (mlx_new_window 리턴값)

크게 사용되는 mlx 함수들을 모두 기술했다.
mlx_put_image_to_window는 그냥 xpm파일을 넣어주는 함수라 간단해서 다음 문서에서 내가 짠 함수를 하나씩 따라가면서 함께 기술하겠다.

profile
내가 다시 보려고 만드는 42서울 본과정 블로그

0개의 댓글