有没有更好的方法来创建这个游戏循环?(C++ /视窗)

3 c++ windows winapi global-variables

我正在开发一款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;
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否有更好的方法来做到这一点(暂时忽略计时器和c)而不是game_cont全球化.总之,我需要能够退出,而在WinMainWinProc,所以如果用户按下关闭出局的方式等,该游戏在游戏菜单,程序不会保留在内存中运行.(正如我在没有game_cont..声明的情况下测试时所做的那样)WinProc.

哦,并且在旁注中,GameRun基本上是一个bool,在游戏结束时返回false,否则为true.

Dan*_*uez 10

是的,使用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;
        }
    }
} 
Run Code Online (Sandbox Code Playgroud)

另外,看看这个(特别是第一个答案)

  • 当不存在消息时,PeekMessage 是执行后台工作的正确方法,但不应在主消息循环中处理“WM_CLOSE”和“WM_DESTROY”。现在,只要任何子控件或不可见的消息帮助器窗口被破坏,您就将中止整个程序! (2认同)