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

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

我想知道是否有比让 game_cont 成为全局的更好的方法(暂时忽略计时器等)。简而言之,我需要能够从 WinProc 中退出 WinMain 中的 while,这样如果用户以不同于游戏的方式按下关闭游戏在游戏菜单中,程序不会在内存中继续运行。 (就像我在 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;
        }
    }
} 

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

关于c++ - 有没有更好的方法来创建这个游戏循环? (C++/Windows ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1800250/

相关文章:

windows - 是否存在用于禁用第 3 方应用程序中的弹出菜单项的 hack,例如 Visual Studio ?

c++ - 如何根据 C++11 标准在不同文件之间拆分模板特化?

c# - 如果给定窗口句柄,我如何确定窗口句柄是否是 Windows UI 的一部分而不是应用程序?

windows - 批处理文件来编辑注册表值?

.net - 是否有 .NET 命名空间可以在其中找到 WIN32 API 消息相关的 #defines,例如 WM_COMMAND 等

c++ - DbgHelp.dll 是 Windows 内置的吗?我可以相信它在那里吗?

delphi - 如何使用Delphi中的WinAPI按名称查找组合框项目的索引?

c++ - 打印二维 std::string 数组

javascript - 在 C++ 自定义向导中创建项目模板之前获取现有解决方案名称

c++ - 从 C++ 调用 Matlab 函数