5

我正在像 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 (鼠标光标正在滚动)。

4

3 回答 3

6

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

    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 会关闭游戏。

于 2010-05-12T10:33:58.517 回答
5

我认为这真的取决于你的背景。Windows 将仅发送 WM_QUIT 以响应您的应用程序调用 PostQuitMessage。这里的一个常见(如果不是很好)解决方案是在程序想要结束时使用 bool 退出消息循环。

于 2010-05-12T08:52:51.483 回答
2

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

PostMessage(hWnd, WM_QUIT, 0, 0 );

hWnd->游戏窗口的句柄

否则打电话给

DestroyWindow(hWnd);

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

PostQuitMessage(0);     
于 2010-05-12T11:22:58.957 回答