본문 바로가기
42seoul/circle-2

[so_long] 03. 창 만들어서 키보드 입력받기

by saniii 2022. 4. 20.

https://github.com/terry-yes/mlx_example  의 자료를 해석했습니다.


 

1. mlx_init()

소프트웨어와 화면을 연결

mlx 라이브러리 초기화

 

 

2. mlx_new_window(mlx, width, height, "SO_LONG");

SO_LONG 이라는 이름을 가지고 너비가 width, 높이가 height인 창 띄우기 

 

 

 

3. 키보드와 연결하기 (MAC ver)

#define X_EVENT_KEY_PRESS		2
#define X_EVENT_KEY_release		3 
#define X_EVENT_KEY_EXIT		17 //exit key code

//Mac key code example
//All the key code example other than below is described on the site linked in READEME.md
#define KEY_ESC			53
# define KEY_W			13
# define KEY_A			0
# define KEY_S			1
# define KEY_D			2

 

#define X_EVENT_KEY_PRESS   2

#define X_EVENT_KEY_release   3 ////근데 이라인은 삭제해도 동작하던데 왜 적는지 모르겠음, 그리고 실제로 함수에서 쓰지도 않는데.....ㅋㅎㅋㅎ

#define X_EVENT_KEY_EXIT   17

 

 

 

 

4. mlx_hook(win, X_EVENT_KEY_PRESS, 0, &key_press, &param);

int	mlx_hook(void *win_ptr, int x_event, int x_mask, int (*funct)(), void *param);
+ 파라미터
    - void *win_ptr : 윈도우 창 인스턴스 포인터
    - int      x_event : 후킹할 이벤트
    - int      x_mask : 후킹할 이벤트 (MAC에서는 사용하지 않음)
    - int   (*funct)() : 이벤트 발생시 호출할 함수(를 가리키는 포인터)
    - void *param   : 필요한 매개변수 저장

+ 반환
    - int  :  반환값이 없다. 

 

>> 키를 누르는 이벤트를 후킹하고, 해당 이벤트가 일어나면 key_press 함수를 따른다. 이에 대한 결과는 param에 저장한다. 

 

 

 

5. 이벤트에 따라 발생한 결과를 저장할 param에 대한 코드

//Since key_press() can recieve only one argument, all the argument shold be gathered in one structure
//x,y and str are meaningless variables.
typedef struct s_param{
	int		x;
	int		y;
}				t_param;

//Only param->x will be used. 
void			param_init(t_param *param)
{
	param->x = 0;
	param->y = 0;
}

키보드에 따라 바뀐 위치(좌표)를 저장하도록 한다. 

(과제에서도 키보드 입력에 따른 걸음수를 알려주길 원함)

 

 

 

6. 지정한 이벤트가 발생할 때 따를 함수에 대한 코드

int				key_press(int keycode, t_param *param)
{
	static int a = 0;

	if (keycode == KEY_W)//Action when W key pressed
		param->x++;
	else if (keycode == KEY_S) //Action when S key pressed
		param->x--;
	else if (keycode == KEY_ESC) //Quit the program when ESC key pressed
		exit(0);
	printf("x: %d\n", param->x);
	return (0);
}

w면 up, s면 down 하도록 구성되어 있음

 

 

 

 

7.  mlx_loop(mlx);

아무 입력이 없을때 loop을 돌려서 프로그램이 종료하지 않고 계속 돌아가도록 해준다. 

계속 돌아가고 있어야 들어오는 (키보드, 마우스 등등의)이벤트를 계속해서 받을 수 있으니까

 

 

 

 

 

[원본]

https://github.com/terry-yes/mlx_example   

https://velog.io/@sayi/42cursursmlx-%ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC-%EC%9E%85%EB%A0%A5-%EC%9D%B4%EB%B2%A4%ED%8A%B8-hooking  

https://harm-smits.github.io/42docs/libs/minilibx/events.html#x11-events

'42seoul > circle-2' 카테고리의 다른 글

[so_long] 04. so_long 회고  (0) 2022.04.27
[so_long] 01. MiniLibX  (2) 2022.04.11
[so_long] 02. 텍스처, 스프라이트 그리고 .ber  (0) 2022.04.11
[so_long] 0. 과제 이해하기  (0) 2022.03.29
[push_swap] 0. 과제 이해하기  (0) 2022.03.05

댓글