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

时间:2009-11-25 22:02:17

标签: 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;
}

我想知道是否有更好的方法(暂时忽略计时器和c),而不是让game_cont成为全球性的。简而言之,我需要能够从WinMainWinProc退出,以便如果用户以游戏菜单中游戏的其他方式按下游戏的关闭,程序不会继续在记忆中运行。 (正如我在game_cont..中没有WinProc语句进行测试时所做的那样。

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

4 个答案:

答案 0 :(得分: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;
        }
    }
} 

另外,请查看this(特别是第一个答案)

答案 1 :(得分:1)

您可以使用exit。 使用atexit确保WM_CLOSE在退出时到达消息队列。

我不知道这里的终极设计是什么,但这是一个想法。

答案 2 :(得分:0)

您可以将game_cont static发送到包含WinMain / WinProc的主文件,但我不知道结构明显更好。

答案 3 :(得分:0)

不,不要那样做。

WM_QUIT 你的旗帜。 GetMessage返回值表示遇到WM_QUIT时。

您的主窗口永远不会收到WM_QUIT,因为它不会发送到窗口。 WM_CLOSE默认会调用DestroyWindow,因此您不需要任何特殊处理。通过调用WM_DESTROY来处理PostQuitMessage,这会在您的主题上生成WM_QUIT,从GetMessage生成特殊返回值,并停止您的消息调度循环。