이 게임 루프를 만드는 더 좋은 방법이 있습니까? (C ++/Windows)
-
05-07-2019 - |
문제
나는 Windows 게임을하고 있는데 이것을 가지고 있습니다.
bool game_cont;
LRESULT WINAPI WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_QUIT: case WM_CLOSE: case WM_DESTROY: game_cont = false; break;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
int WINAPI WinMain(/*lots of parameters*/)
{
//tedious initialization
//game loop
while(game_cont)
{
//give message to WinProc
if(!GameRun()) game_cont = false;
}
return 0;
}
그리고 나는 이것 (지금 당시 타이머를 무시하는 더 좋은 방법)이 있는지 궁금합니다. game_cont
글로벌이어야합니다. 요컨대, 나는 잠시 동안 나갈 수 있어야한다 WinMain
~에서 WinProc
, 사용자가 게임 메뉴에서 게임이 게임에서 닫히면 프로그램이 계속 실행되지 않습니다. (내가 이것을없이 이것을 테스트했을 때와 마찬가지로 game_cont..
진술 WinProc
.
아, 그리고 부수적으로, GameRun
기본적으로 게임이 끝나면 거짓을 반환하는 부리입니다. 그렇지 않으면 사실입니다.
해결책
예, 사용하십시오 PeekMessage, 그것은 게임 개발의 표준입니다.
이것이 최선의 접근법입니다.
int Run()
{
MSG msg;
while(true)
{
if(::PeekMessage(&msg,0,0,0 PM_REMOVE))
{
if(msg.message == WM_QUIT ||
msg.message == WM_CLOSE ||
msg.message == WM_DESTROY)
break;
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
else
{
//Run game code
if(!GameRun())
break;
}
}
}
또한 봐 이것 (특히 첫 번째 답변)
다른 팁
당신은 만들 수 있습니다 game_cont
static
당신의 메인 파일에 WinMain
/WinProc
, 그러나 나는 훨씬 더 나은 구조를 모른다.
아니, 그렇게하지 마세요.
WM_QUIT
~이다 당신의 깃발. GetMessage
반환 값은 언제를 나타냅니다 WM_QUIT
만난다.
당신의 기본 창은 결코받지 못할 것입니다 WM_QUIT
, 창으로 보내지 않기 때문에. WM_CLOSE
전화 할 것입니다 DestroyWindow
기본적으로이를 위해 특별한 취급이 필요하지 않습니다. 핸들 WM_DESTROY
전화로 PostQuitMessage
, 결과 WM_QUIT
당신의 스레드에서, 특별한 반환 값 GetMessage
, 메시지 디스패치 루프를 중지합니다.