문무겸비

[miniRT] minilibx-linux 튜토리얼 본문

42seoul

[miniRT] minilibx-linux 튜토리얼

세월의 잔잔한 느낌 2021. 2. 10. 23:09
반응형

intra에서 기본적으로 제공해주는 minilibx에는 이 파일이 없다.

minilibx-linux docs를 제공해 준 Harm smitt에게 감사를 표하자

고마워요 Harm!

실행하는 방법

(은 gwpaeng.tistory.com/249?category=897814 여기를 참고하자)

위 블로그와 이 과정을 보면 사실상 해결.

Hook

int main(void)
{ 
	t_vars vars;
	vars.mlx = mlx_init();
	vars.win = mlx_new_window(vars.mlx, 640, 480, "Hello world!");
	mlx_key_hook(vars.win, key_hook, &vars);
	mlx_mouse_hook(vars.win, mouse_win3, &vars);
	mlx_loop(vars.mlx);
}

 

int key_hook(int keycode, t_vars *vars)
{
  printf("Hello from key_hook!\t");
  printf("keycode = %d\n", keycode);
}
int mlx_key_hook(t_win_list *win,int (*funct)(),void *param)
{
  win->hooks[KeyRelease].hook = funct;
  win->hooks[KeyRelease].param = param;
  win->hooks[KeyRelease].mask = KeyReleaseMask;
}
typedef struct s_event_list
{
  int mask;
  int (*hook)();
  void *param;
} t_event_list;
typedef struct s_win_list
{
  Window window;
  GC gc;
  struct s_win_list *next;
  int (*mouse_hook)();
  int (*key_hook)();
  int (*expose_hook)();
  void *mouse_param;
  void *key_param;
  void *expose_param;
  t_event_list hooks[MLX_MAX_EVENT];
} t_win_list;

mlx_key_hook이 key_hook 함수를 t_win_list win->hooks->hook에 넣어준다

mlx_hook은 여러개를 걸 수 있다.

but, key와 관련된 hook은 mlx_key_hook이든 mlx_hook이든 합쳐서 하나밖에 못한다.

아마 마우스도 비슷하게 될거같다.

같은 하드웨어는 같은 mask를 사용해서 하기 때문에 나중에 설정된것만 적용되는듯 한다

 

일단 기본적으로 minilibx-linux docs를 처음부터 끝까지 잘 따라하면 시작하는 부분, 튜토리얼 마냥 minilibX의 역할을 깨우치기는 쉽다.

빨간점 그리기 성공..!

솔직히 hook의 동작원리를 잘 모르겠다... 되니까 쓰긴 하는데...

 

마우스 커서 구현

마우스 커서를 구현

x자 모양이 실제 커서이고, 마우스커서처럼 보이는건 이미지 파일을 이용해서 구현한 것이다. 

설명에는 mlx_png_file_to_image()가 있다고 하는데... 없다 minilibx-linux에만 없는걸지도 모르겠다.

png to xpm converter는 인터넷에 검색하면 웹서비스로 이용가능하니까 문제없다.

t_vars		vars;
t_data		img;

int	mouse_hook(int x,int y, void *p)
{
	mlx_clear_window(vars.mlx,vars.win);
	mlx_put_image_to_window(vars.mlx, vars.win, img.img, x, y);
	printf("Mouse moving in Win3, at %dx%d.\n",x,y);
}

int     main(void)
{
	char		*relative_path = "./test/mouse.xpm";
	int			img_width;
	int			img_height;

	// printf("%d\n", open("./test/mouse.xpm",O_RDONLY));
	vars.mlx = mlx_init();
	vars.win = mlx_new_window(vars.mlx,WIN1_SX,WIN1_SY,"Title1");
	img.img = mlx_xpm_file_to_image(vars.mlx, relative_path, &img_width, &img_height);
	img.addr = mlx_get_data_addr(img.img, &img.bits_per_pixel, &img.line_length, &img.endian);
	// mlx_put_image_to_window(vars.mlx, vars.win, img.img, WIN1_SX / 2, WIN1_SY / 2);
	if (!img.img)
		printf("\nfail\n");
	else
		printf("\nfind\n");
	mlx_hook(vars.win, MotionNotify, PointerMotionMask, mouse_hook, &vars);
	// mlx_key_hook(win, key_hook,0);
	mlx_loop(vars.mlx);
}

mouse hook을 이용해서, 마우스 커서가 움직일때마다 hook을 발동, 커서 이미지를 커서 위치에다가 그려넣는다 (그전에 그렸던건 삭제!)

반응형