有没有更好的方法来创建这个游戏循环? (C ++ /视窗)
-
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;
}
我想知道是否有更好的方法来做到这一点(暂时忽略计时器& c。)而不是 game_cont
是全局的。简而言之,我需要能够从 WinProc
中的 WinMain
中退出,这样如果用户按照游戏的其他方式按下游戏的关闭在游戏菜单中,程序不会继续在内存中运行。 (正如我在 WinProc
中没有 game_cont ..
语句的情况下测试时那样。
哦,并且在旁注中, GameRun
基本上是一个bool,在游戏结束时返回false,否则为true。
解决方案
是的,使用 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
,因此您不需要任何特殊处理。通过调用 PostQuitMessage
处理 WM_DESTROY
,这会导致线程上的 WM_QUIT
, GetMessage
的特殊返回值,以及停止你的消息调度循环。
不隶属于 StackOverflow