본문 바로가기

デベロップメント/ゲームプログラミング

2.2.5 메세지 루프

2.2.5 메세지 루프


윈도우는 메세지를 송신하는 것에 대해서 프로그램과 교환을 합니다.

이 메세지를 사용해, 마우스의 이동이나 키의 눌림 같은, 유저에서의 조작이 전해집니다.

또 메세지는 Windows에서의 커맨드라고 하는 경우도 있습니다.

WinMain 내의 루프를 사용해 메세지가 있는가를 체크합니다.(코드 2.8)

어플리케이션이 유저에서의 문자입력을 받을 경우는, 이 메세지 루프내에 TranslateMessage 함수를 호출할 필요가 있습니다.

TranslateMessage는 가상 키 메세지를 문자 메세지로 변환하는 Windows 함수입니다.

메세지는 DispatchMessage 함수에 대해 WinProc 함수로 보내고, 처리됩니다.

WinMain은 WM_QUIT 메세지가 수신될 때 까지 이 루프를 계속합니다.

WinMain이 시스템에 돌아올 때 반환 값에는, WM_QUIT 메세지의 wParam 파라메터가 저장됩니다.


#코드 2.8 메인의 메세지 루프

	// 메인의 메세지 루프
	int done = 0;
	while(!done){
		// PeekMessage는 Windows 메세지가 있는가를 체크하는 비(非)블록 메소드
		if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
			if(msg.message == WM_QUIT)
				done = 1;
			// 메세지를 디코드해서 WinProc에 전달
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}
	return msg.wParam;
}


메세지 루프에서 GetMessage 말고, PeekMessage를 사용하는 것에 주의해주세요.
GetMessage는 메세지를 기다렸다가 돌아옵니다.

한편, PeekMessage는 착신하고 있는 메세지가 있는가를 체크합니다만, 처리할 메세지가 없는 경우에 기다리는 것은 할 수 없습니다.

즉, 메세지 루프를 항상 최대한의 속도로 실행해 진행 할 수 있습니다.

이것은 애니메이션을 사용해 그래픽스를 포함한 게임에는 불가결(不可欠)한 동작입니다.



서장으로