Frage

Ich arbeite an einer Windows-Spiel, und ich habe dies:

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

und ich Frage mich, ob es einen besseren Weg gibt, dies zu tun (ignorieren timers &c.für jetzt), als game_cont global sein.Kurz gesagt, ich muss in der Lage sein, zu verlassen, während in WinMain von WinProc, so dass, wenn der Benutzer drückt, schließt sich das Spiel in einem anderen Weg, dass das Spiel im Spiel-Menü, das Programm wird nicht weiter laufen Speicher.(Wie damals, als ich getestet, ohne game_cont.. Anweisung WinProc.

Oh, und auf einer Seite zur Kenntnis, GameRun im Grunde ist ein bool, das false zurückgibt, wenn das Spiel endet, und andernfalls true.

War es hilfreich?

Lösung

Ja, verwenden Sie PeekMessage, es ist die standard in die Spiele-Entwicklung.

Dies ist der beste Ansatz, glaube ich, dass:

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

Betrachten Sie auch diese (speziell die erste Antwort)

Andere Tipps

Sie könnte verwenden exit.Verwenden atexit um sicherzustellen, dass WM_CLOSE bekommt die Nachricht que, wenn seine Zeit zu verlassen.

Ich weiß nicht, was das ultimative design-hier, aber es ist eine Idee.

Sie machen könnten game_cont static zu Ihren Haupt-Datei, die hat WinMain/WinProc, aber ich weiß nicht, der eine deutlich bessere Struktur.

Nein, das nicht.

WM_QUIT ist Ihre Flagge. GetMessage Rückgabewert zeigt an, Wann WM_QUIT aufgetreten ist.

Ihre Haupt-Fenster nie erhalten WM_QUIT,, da es nicht an ein Fenster gesendet. WM_CLOSE rufen DestroyWindow standardmäßig, so dass Sie brauchen keine Besondere Behandlung, für, dass.Griff WM_DESTROY durch den Aufruf PostQuitMessage, die Ergebnisse in WM_QUIT auf dein thread, den speziellen Rückgabewert GetMessage, und hält Ihre Nachricht Versand-Schleife.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top