2010-05-12 30 views
5

Estoy creando juegos de Mario como en win32 GDI. He implementado el nuevo bucle de juegos:Juego de bucle en 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(); 
    } 
} 

Pero mi juego sólo corriendo hasta que presione Ctrl + Alt + Del (cursor del ratón está rodando).

+1

¿Cuál es la pregunta? –

+2

¿'GameLoop()' regresa? –

+0

Pregunta realmente estúpida, pero tiene un programa de Windows para manejar los mensajes de Windows, ¿verdad? – zebrabox

Respuesta

6

Siempre he estado usando algo así:

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 es la implementación real del juego Lopp, onError() es un controlador de errores (se tarda descripción del error como argumento), y "correr" es o bien una variable global bool o un miembro de la clase. Configurar "ejecutar" en falso apaga el juego.

5

Creo que esto realmente depende de su contexto. Windows solo enviará un WM_QUIT en respuesta a su aplicación llamando a PostQuitMessage. Una solución común (si no genial) aquí es usar un bool para salir del ciclo de mensajes cuando su programa quiera finalizar.

2

Supongo que el programa puede pedirle al usuario que continúe o salga, dentro de la llamada a la función GameLoop. Al salir, envíe el mensaje WM_QUIT a la ventana.

PostMessage(hWnd, WM_QUIT, 0, 0); 

hWnd-> El mango de la ventana de juego

otra cosa hacer una llamada a

DestroyWindow(hWnd); 

Esto enviará un WM_DESTROY a su procedimiento de ventana. Ahí puede llamar al

PostQuitMessage(0);  
Cuestiones relacionadas