Domanda

Sto creando gioco mario come in Win32 GDI. Ho implementato il nuovo ciclo per il gioco:

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

Ma il mio gioco solo in esecuzione fino a quando si preme Ctrl + Alt + Canc (cursore del mouse sta rotolando).

È stato utile?

Soluzione

Ho sempre usato qualcosa di simile:

    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 è effettiva attuazione gioco Lopp, onError () è un gestore di errori (prende descrizione di errore come argomento), e "correre" è sia una variabile bool globale o un membro della classe. Impostazione "correre" a false arresta il gioco.

Altri suggerimenti

Credo che questo dipende molto sul vostro contesto. Windows solo inviare un WM_QUIT in risposta alla vostra applicazione chiamante PostQuitMessage. Un comune (se non grande) la soluzione è quella di utilizzare un bool per uscire dal ciclo di messaggi quando il programma vuole porre fine.

Credo che il programma può chiedere all'utente di continuare o di uscita, all'interno chiamata di funzione GameLoop. All'uscita Messaggio WM_QUIT messaggio alla finestra.

PostMessage(hWnd, WM_QUIT, 0, 0 );

hWnd-> La maniglia della finestra di gioco

altro effettuare una chiamata a

DestroyWindow(hWnd);

Questo invierà un WM_DESTROY alla window procedure. Ci si può chiamare

PostQuitMessage(0);     
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top