ciclo di gioco in Win32 API
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).
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);