Is there a better way to create this game loop? (C++/Windows)

c++, global-variables, winapi, windows

Solution

Yes, use PeekMessage, it's the standard in game development.

This is the best approach, I believe:

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

Also, look at this (specially the first answer)

Problem

I'm working on a Windows game, and I have this: ``` 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; } ``` and I am wondering if there is a better way to do this (ignoring timers &c. for right now) than to have `game_cont` be global. In short, I need to be able to exit the while in `WinMain` from `WinProc`, so that if the user presses the closes out of the game in a way other that the game's in game menu, the program wont keep running in memory. (As it did when I tested this without the `game_cont..` statement in `WinProc`. Oh, and on a side note, `GameRun` is basically a bool that returns false when the game ends, and true otherwise.

Original source

Related problems