Win32 API中的游戏循环

时间:2010-05-12 08:35:01

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

我在win32 GDI中创建游戏mario。我已经实现了游戏的新循环:

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

3 个答案:

答案 0 :(得分: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”是全局bool变量或类成员。将“running”设置为false会关闭游戏。

答案 1 :(得分:5)

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

答案 2 :(得分:2)

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

PostMessage(hWnd, WM_QUIT, 0, 0 );

hWnd->游戏窗口的句柄

否则拨打

DestroyWindow(hWnd);

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

PostQuitMessage(0);