【问题标题】:Game loop in Win32 APIWin32 API 中的游戏循环
【发布时间】:2011-02-18 12:23:37
【问题描述】:

我正在创建类似 win32 GDI 的游戏马里奥。我已经为游戏实现了新循环:

PeekMessage(&msg,NULL,0,0,PM_NOREMOVE);

while (msg.message!=WM_QUIT)
{
    if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    else // No message to do
    {
        gGameMain->GameLoop();  
    }
}

但我的游戏一直在运行,直到我按下 Ctrl + Alt + Del (鼠标光标正在滚动)。

【问题讨论】:

  • 真的很愚蠢的问题,但你有一个 windows proc 来处理 windows 消息,对吧?

标签: c++ winapi gdi+ game-loop


【解决方案1】:

我猜程序可能会在 GameLoop 函数调用中要求用户继续或退出。退出时将 WM_QUIT 消息发布到窗口。

PostMessage(hWnd, WM_QUIT, 0, 0 );

hWnd->游戏窗口的句柄

打电话给

DestroyWindow(hWnd);

这会将 WM_DESTROY 发送到您的窗口过程。在那里你可以打电话

PostQuitMessage(0);     

【讨论】:

    【解决方案2】:

    我一直在使用类似的东西:

        MSG msg;
        while (running){
            if (PeekMessage(&msg, hWnd, 0, 0, PM_REMOVE)){
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
            else
                try{
                    onIdle();
                }
                catch(std::exception& e){
                    onError(e.what());
                    close();
                }
        }
    

    onIdle 是实际的游戏 lopp 实现,onError() 是一个错误处理程序(将错误描述作为参数),“running”是一个全局布尔变量或类成员。将“running”设置为 false 会关闭游戏。

    【讨论】:

      【解决方案3】:

      我认为这实际上取决于您的上下文。 Windows 只会发送 WM_QUIT 以响应您的应用程序调用 PostQuitMessage。这里的一个常见(如果不是很好)解决方案是在程序想要结束时使用 bool 来退出消息循环。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-21
        • 1970-01-01
        • 2014-03-06
        • 1970-01-01
        • 1970-01-01
        • 2011-12-13
        • 1970-01-01
        相关资源
        最近更新 更多