我正在开发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;
        }
    }
} 

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

其他提示

您可以使用 退出 。 使用 atexit 确保WM_CLOSE获得到退出时的消息队列。

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

您可以将 game_cont static 添加到主文件中,该文件包含 WinMain / WinProc ,但我不知道知道一个明显更好的结构。

不,不要那样做。

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

您的主窗口永远不会收到 WM_QUIT ,因为它不会发送到窗口。 WM_CLOSE 默认会调用 DestroyWindow ,因此您不需要任何特殊处理。通过调用 PostQuitMessage 处理 WM_DESTROY ,这会导致线程上的 WM_QUIT GetMessage 的特殊返回值,以及停止你的消息调度循环。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top