Question

Je travaille sur un jeu Windows, et j'ai ceci:

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

et je me demande s’il existe un meilleur moyen de le faire (en ignorant les minuteries, etc.) que de faire en sorte que game_cont soit global. En bref, je dois être en mesure de quitter le paramètre while dans WinMain de WinProc , de sorte que si l'utilisateur appuie sur la fermeture du jeu d'une manière autre que celle du jeu. dans le menu du jeu, le programme ne continuera pas à fonctionner en mémoire. (Comme ce fut le cas lorsque j'ai testé cela sans l'instruction game_cont .. dans WinProc .

Oh, et en passant, GameRun est fondamentalement un booléen qui retourne false lorsque le jeu se termine et true sinon.

Était-ce utile?

La solution

Oui, utilisez PeekMessage , c'est la norme dans le développement de jeux.

C’est la meilleure approche, je crois:

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

Regardez également this (spécialement la première réponse)

Autres conseils

Vous pouvez utiliser quitter . Utilisez atexit pour vous assurer que WM_CLOSE reçoit au message que quand il est temps de sortir.

Je ne sais pas quel est le design ultime ici, mais c'est une idée.

Vous pouvez créer game_cont statique dans votre fichier principal contenant WinMain / WinProc , mais je ne t connaître une structure nettement meilleure.

Non, ne faites pas ça.

WM_QUIT est votre drapeau. La valeur de retour GetMessage indique quand WM_QUIT est rencontré.

Votre fenêtre principale ne recevra jamais WM_QUIT , car elle n'est pas envoyée à une fenêtre. WM_CLOSE appellera DestroyWindow par défaut, vous n'avez donc besoin d'aucun traitement spécial pour cela. Traitez WM_DESTROY en appelant PostQuitMessage , ce qui entraîne WM_QUIT sur votre thread, la valeur de retour spéciale de GetMessage , et arrête votre boucle d'envoi de messages.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top