먼저, 이 포스팅은 개인 공부 포스팅임을 밝힙니다.
우선, WINAPI에 대하여,
윈도우 API를 통해 손쉽게 윈도우 애플리케이션을 생성할 수 있습니다.
비주얼 스튜디오에서 윈도우 애플리케이션 프로젝트를 생성하면
WINAPI의 기본 틀과 함께 프로젝트가 시작됩니다.
일반적인 코드는 CLI 환경, 즉 콘솔에서 생성되지만,
Window 애플리케이션 프로젝트를 생성하게 되면, 자동적으로 윈도우가 콘솔창이 아닌,
위와 같이 GUI를 지닌 애플리 케이션 템플릿을 만들어 줄 것입니다.
WINAPI에 대하여 자세히 알면 좋지만, DX를 다루는 데에도 벅차기 때문에 필수적인 것만 적습니다.
WINAPI에서는 실행창을 띄워줄 수 있다는 사실과
계속해서 메시지를 받고 있다는 사실만 알고 넘어가야 합니다.
* 메시지
시스템에서 보내는 다양한 메시지입니다.
예를 들어, 사용자가 어떤 키를 눌렀을 때,
화면 크기를 바꿀 때, 창을 꺼버렸을 때 등등
시스템에서는 "유저가 K 버튼을 눌렀다" 등의 메시지를 프로그램에게 전달합니다.
이를 프로시저를 통해 처리하게 되며, 두가지 종류가 있습니다.
1. GetMessage :
처음 프로젝트를 생성하면 GetMessage 루프가 생성되어 있을 겁니다.
GetMessage는 메시지를 받지 않으면 대기를 합니다.
2. PeekMessage :
PeekMessage의 경우, 메시지가 없으면 FALSE를 반환합니다.
* 그러면 두 프로시저 중 어느 것을 사용할까요?
게임을 만드는 입장에서는, 유저가 아무것도 하지 않아도 화면을 계속 갱신하고,
시간이 계속 흐르게 해야 하는 등.. 메시지가 없어도 프로그램은 계속 동작해야만 합니다.
따라서, GetMessage처럼, 메시지를 받기 전까지 계속 대기를 한다면 사용하기 어렵습니다.
우리는 PeekMessage를 사용하여 게임을 구성하게 될 것입니다.
아래는 제가 구성한 메시지 루프의 예시입니다.
// 기본 메시지 루프입니다:
while (true)
{
if (PeekMessage(&msg, NULL, WM_NULL, WM_NULL, PM_REMOVE))
{
if (msg.message == WM_QUIT) return static_cast<int>(msg.wParam);
DispatchMessage(&msg);
}
//아무런 메시지가 없으면 WM_APP을 보냄
else
{
SendMessageA(hWnd, WM_APP, 0, 0);
}
}
return (int) msg.wParam;
메시지의 종류는 기본적으로 다음과 같습니다.
* WM_Create : 창을 처음 생성할 경우 받는 메시지
* WM_APP : 사용자 정의 메시지입니다. 저같은 경우, 아무일도 없으면 이 메시지를 보내도록 합니다.
* WM_Size : 화면 사이즈가 변경될 때 받는 메시지이자, 처음에 창을 생성할 때에도
창의 크기를 맞추기 위해 1회 받습니다.
* WM_Destroy : 화면을 닫으면 받는 메시지입니다.
DX 엔진을 제작하고자 한다면, 해당 프로시저에 따라 적절한 코드를 넣어줄 필요가 있습니다.
예를 들면, WM_Create : 의 프로시저를 실행할 때,
그래픽 요소(버퍼나 텍스쳐 등)를 그려줄 다양한 요소를 초기화하고, 정의하거나
레이아웃을 설정하거나, 어떤 정책으로 색을 혼합할 지 등등 정말 다양한 셋팅을 해줄 수 있습니다.
WM_Size의 경우, 윈도우의 사이즈가 변경될 때, 뷰포트 및 레이아웃의 사이즈를 조정해줄 수 있을 것이고,
WM_APP의 경우 매 순간 갱신되는 핵심 코드들이 들어가게 될 것입니다.
WM_Destroy의 경우에는 게임을 종료하고, 사용했던 자원들을 Release()해주게 될 것입니다.
'공부 및 정리 > DirectX' 카테고리의 다른 글
DirectX3D - 필기1 (0) | 2022.05.10 |
---|