- 인자 검사: 프로그램은 정확히 2개의 인자(프로그램 이름과 파일 이름)를 기대합니다. 그렇지 않으면 error(1)을 호출하여 오류를 처리합니다.
- FDF 초기화: init_fdf 함수를 사용하여 t_fdf 구조체를 초기화합니다. 이 구조체는 프로그램의 주요 데이터를 저장할 것으로 보입니다.
- 초기 렌더링: render 함수를 호출하여 초기 화면을 그립니다.
- 이벤트 훅 설정:
- mlx_key_hook을 사용하여 키 이벤트 핸들러를 설정합니다.
- mlx_expose_hook을 사용하여 expose 이벤트 핸들러를 설정합니다.
- 메인 루프: mlx_loop를 호출하여 이벤트 루프를 시작합니다. 이는 프로그램이 사용자 입력을 계속 기다리게 합니다
이 코드는 3D 와이어프레임 모델을 표시하는 프로그램의 메인 함수와 expose 이벤트 핸들러를 포함하고 있으며, MiniLibX 라이브러리의 키 이벤트 처리 메커니즘을 설명합니다.
mlx_key_hook 함수 정의
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;
}
이 함수는 키 릴리스 이벤트에 대한 콜백 함수를 설정합니다:
매개변수:
win: 이벤트를 처리할 창을 나타내는 t_win_list 구조체 포인터
funct: 키 릴리스 이벤트 발생 시 호출될 함수 포인터
param: 콜백 함수에 전달될 추가 매개변수
동작:
win->hooks[KeyRelease].hook = funct: 키 릴리스 이벤트에 대한 콜백 함수 설정
win->hooks[KeyRelease].param = param: 콜백 함수에 전달될 매개변수 설정
win->hooks[KeyRelease].mask = KeyReleaseMask: 이벤트 마스크를 KeyReleaseMask로 설정하여 키 릴리스 이벤트만 처리하도록 함
mlx_key_hook 함수 호출
mlx_key_hook(fdf->win, &key_handle, fdf);
이 라인은 실제로 mlx_key_hook 함수를 호출하여 키 이벤트 핸들러를 설정합니다:
fdf->win: 이벤트를 처리할 창을 지정합니다. fdf는 프로그램의 주요 데이터 구조체로 보입니다.
&key_handle: 키 릴리스 이벤트 발생 시 호출될 함수의 주소입니다. 이 함수는 별도로 정의되어 있어야 합니다.
fdf: 콜백 함수에 전달될 매개변수입니다. 이를 통해 key_handle 함수 내에서 프로그램의 상태에 접근할 수 있습니다.
이 설정으로 인해, 사용자가 키를 눌렀다 뗄 때마다 key_handle 함수가 호출되며, 이 함수는 fdf 구조체를 매개변수로 받아 적절한 동작을 수행할 수 있습니다.
C 언어에서 함수 포인터를 사용하는 전형적인 방법은 함수명에 &를 붙여서 전달하는 것이 있습니다.
이 경우, key_handle 함수의 주소를 이벤트 처리 시스템에 전달하여 특정 이벤트(여기서는 키 입력)가 발생했을 때 이 함수가 호출되도록 합니다. 이 과정을 상세히 설명하겠습니다:
함수 정의:
int key_handle(int keycode, t_fdf *fdf)
이 함수는 키 입력을 처리합니다.
keycode: 눌린 키의 코드
fdf: FdF 프로그램의 주요 데이터 구조체
함수 포인터 전달:
&key_handle은 key_handle 함수의 메모리 주소를 나타냅니다.
이 주소를 이벤트 처리 함수(예: mlx_key_hook)에 전달합니다.
이벤트 시스템 설정:
일반적으로 다음과 같이 사용됩니다:
mlx_key_hook(fdf->win, &key_handle, fdf);
이는 "fdf->win 창에서 키 이벤트가 발생하면 key_handle 함수를 호출하고, fdf를 인자로 전달하라"는 의미입니다.
콜백 메커니즘:
키 이벤트 발생 시, 시스템은 저장된 함수 주소(&key_handle)를 사용하여 key_handle 함수를 호출합니다.
시스템은 자동으로 keycode와 fdf 인자를 제공합니다.
유연성과 모듈성:
이 방식은 이벤트 처리 로직을 메인 루프와 분리하여 코드의 구조를 개선합니다.
필요에 따라 다른 키 처리 함수로 쉽게 교체할 수 있습니다.
타입 안전성:
함수 포인터의 타입이 정확히 일치해야 합니다. 여기서는 int (*)(int, t_fdf*) 형태여야 합니다.
이 방식을 통해 FdF 프로그램은 사용자의 키 입력에 효율적으로 반응하며, 3D 모델의 조작(회전, 확대/축소 등)을 구현할 수 있습니다.
Expose 핸들러 (expose_handle)
static int expose_handle(t_fdf *fdf)
{
render(fdf);
return (0);
}
이 함수는 윈도우가 노출될 때(예: 다른 윈도우에 가려졌다가 다시 보이게 될 때) 호출됩니다.
재렌더링: render 함수를 호출하여 화면을 다시 그립니다. 이는 윈도우 내용이 손상되었을 때 화면을 복원하는 데 필요합니다.
반환 값: 0을 반환하여 이벤트가 성공적으로 처리되었음을 나타냅니다.
이 코드는 MLX (MiniLibX) 라이브러리를 사용하고 있으며, 이는 X-Window 및 Cocoa에 대한 간단한 그래픽 인터페이스를 제공합니다. 이 프로그램은 파일에서 3D 모델 데이터를 읽어 와이어프레임으로 표시하고, 키보드 입력을 통해 모델을 조작할 수 있게 해줍니다.
'C Language' 카테고리의 다른 글
부모 자식 프로세스 fork pid pipe 코드 (0) | 2025.01.23 |
---|---|
MiniLibX 에서 hook, KeyPressMask KeyReleaseMask의 의미 (2) | 2025.01.22 |
3d 와이어프레임 모델 구조체 설명 (0) | 2025.01.22 |
MiniLibX 라이브러리의 t_win_list 구조체 설명 (0) | 2025.01.22 |
3차원 프로젝트에서 z 값에 대해서만 min_z를 두는 이유 (0) | 2025.01.21 |