2010-05-12 8 views
5

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

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).

+1

Qual è la domanda? –

+2

restituisce 'GameLoop()'? –

+0

Davvero una domanda stupida, ma hai un Windows Proc per gestire i messaggi di Windows, giusto? – zebrabox

risposta

6

ho sempre usato una cosa del genere:

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" o è un variabile globale di bool o un membro della classe. Impostare "running" su false spegne il gioco.

5

Penso che questo dipenda davvero dal contesto. Windows invierà solo un WM_QUIT in risposta all'applicazione che chiama PostQuitMessage. Una soluzione comune (se non eccezionale) è quella di usare un bool per uscire dal ciclo dei messaggi quando il tuo programma vuole finire.

2

Immagino che il programma possa chiedere all'utente di continuare o uscire, all'interno della chiamata della funzione GameLoop. All'uscita Invia messaggio WM_QUIT 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 puoi chiamare

PostQuitMessage(0);