miniRT 진행(1) mlx 튜토리얼 -1

naranghae·2020년 12월 28일
0

miniRT

목록 보기
3/10

화면만들기

int main()
{
	void	*mlx_ptr;
	void	*win_ptr;

	mlx_ptr = mlx_init();
	win_ptr = mlx_new_window(mlx_ptr, 500, 500, "mlx_test");
	mlx_loop(mlx_ptr);
}

검은 화면이 만들어진다.
mlx_new_window(mlx_ptr, 500, 500, "mlx_test"); 에서 500은 각각 x, y 해상도이고,
다음 " "안에 들어가는 것은 만들어진 화면의 이름을 나타낸다.

화면을 esc로 종료하기

https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values
이 사이트를 보면
The Esc (Escape) key. Typically used as an exit, cancel, or "escape this operation" button. Historically, the Escape character was used to signal the start of a special control sequence of characters called an "escape sequence."
라고 설명하는 부분을 보면 window에서 esc는 0x1B를 나타내고, linux에서는 0xFF1B를 나타낸다.
그래서 코드를

void	*mlx_ptr;
void	*win_ptr;

int	press_esc_key(int key, void *p)
{
	if (key == 0xFF1B)
		exit(0);
}

int main()
{
	mlx_ptr = mlx_init();
	win_ptr = mlx_new_window(mlx_ptr, 500, 500, "mlx_test");
	mlx_key_hook(win_ptr, press_esc_key, win_ptr);
	mlx_loop(mlx_ptr);
}

이렇게 작성했을 때 esc를 누르면 화면이 ctrl+c를 누르지 않아도 종료된다.
단, 이렇게 exit(0)으로 화면을 끄게 하면 창이 3개를 띄웠다고 했을 때 다 종료된다.
그래서 화면을 선택해서 끄게 하려면

int mlx_destroy_window(void *mlx_ptr, void *win_ptr);

이 함수를 사용한다.
마지만 이러한 함수만을 사용하여 창을 끄면 완전히 프로그램이 종료되지 않고 창만 닫으므로 완전이 종료하고 싶을 때 exit(0)을 사용해야 한다.

mlx 이벤트 제어 함수

어떤 key를 눌렀는지 확인하는 함수

원 함수: int mlx_key_hook ( void *win_ptr, int (*funct_ptr)(), void *param );
실제 사용 시: mlx_key_hook(win_ptr,key_check,0);

int	key_check(int key,void *p)
{
  printf("Key in Win : %d\n",key);
  if (key==0xFF1B) //esc를 누르면 종료
    exit(0);
}

만든 창을 클릭했을 때 (x, y)좌표를 확인하는 함수 (클릭 시 픽셀 확인 및 어떤 마우스 버튼으로 클릭 했는지 표시)

원 함수: int mlx_mouse_hook ( void *win_ptr, int (*funct_ptr)(), void *param );
실제 사용 시: mlx_mouse_hook(win,mouse_button,0);

int	mouse_button(int button,int x,int y, void *p)
{
  printf("Mouse_button in Win, button %d at %dx%d.\n",button,x,y);
}

만든 창을 마우스로 가져다 올렸을 때 현재 어떤 곳인지 확인하는 함수

원 함수: int mlx_hook(void *win_ptr, int x_event, int x_mask, int (*funct)(), void *param);
실제 사용 시: mlx_hook(win, MotionNotify, PointerMotionMask, mouse_pos, 0);

int	mouse_pos(int x,int y, void *p)
{
  printf("Mouse moving in Win, at %dx%d.\n",x,y);
}

https://tronche.com/gui/x/xlib/events/processing-overview.html#PointerMotionHintMask
이 사이트를 보면 아래와 같은 내용이 나온다.
PointerMotionMask
클라이언트 애플리케이션은 포인터 버튼의 상태에 관계 없이 MotionNotify 이벤트를 수신합니다.

만든 창에 pixel 색 지정하는 함수

원 함수: int mlx_pixel_put ( void *mlx_ptr, void *win_ptr, int x, int y, int color );
실제 사용 시: mlx_pixel_put(mlx,win,x,y,color);

int	color_map(void *win,int w,int h)
{
  int	x;
  int	y;
  int	color;

  x = w;
  while (x--)
    {
      y = h;
      while (y--)
        {
          color = (x*255)/w+((((w-x)*255)/w)<<16)+(((y*255)/h)<<8);
	  	  mlx_pixel_put(mlx,win,x,y,color);
        }
    }
}

만든 창에 글씨를 띄우는 함수

원 함수: int mlx_string_put(void *mlx_ptr, void *win_ptr, int x, int y, int color, char *string);
실제 사용 시: mlx_string_put(mlx,win,5, 20, 0xFF99FF,"String input");

결과

profile
오늘보다 더 나은 내일

0개의 댓글