2010-05-12 15 views
5

Ben win32 GDI gibi oyun mario oluşturuyorum. Oyun için yeni döngü uyguladık:Win32 API oyun döngüsü

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

Ama Ctrl + Alt + Del (fare imleci inişli çıkışlı olduğunu) basana kadar benim oyun sadece çalışan.

+1

Sorunuz nedir? –

+2

'GameLoop()' döndürüyor mu? –

+0

Gerçekten aptalca bir soru, fakat windows mesajlarını işlemek için bir pencere progresine sahipsin, değil mi? – zebrabox

cevap

6

Hep böyle bir şey kullanıyorum:

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 (gerçek oyun lopp uygulamasıdır, onError) bir hata işleyicisi olan (argüman olarak hata açıklaması alır) ve "çalışan" ya bir olduğunu global bool değişkeni veya bir sınıf üyesi. Sahte "koşmak" ayarını yapmak oyunu kapatır.

5

Bunun gerçekten sizin içeriğinize bağlı olduğunu düşünüyorum. Windows, PostQuitMessage uygulamanıza yanıt olarak yalnızca bir WM_QUIT gönderecektir. Genel (eğer büyük değilse) bir çözüm, programın bitmek istediğinde mesaj döngüsünden çıkmak için bir bool kullanmaktır.

2

Program, GameLoop işlev çağrısı içinde kullanıcının devam etmesini veya çıkmasını isteyebilir. Pencereye çıkış sonrası WM_QUIT mesajı.

PostMessage(hWnd, WM_QUIT, 0, 0); 

hWnd->

DestroyWindow(hWnd); 

Bu oyun penceresinin başka

arama yapmak sapı sizin pencere prosedürüne bir WM_DESTROY gönderecek. Orada

PostQuitMessage(0);