2010-05-12 82 views
5

我正在創建像win32 GDI一樣的遊戲馬里奧。我已經實現了新的循環遊戲:在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(); 
    } 
} 

但我的比賽剛剛運行,直到我按下Ctrl + Alt + Del鍵(鼠標光標滾動)。

+1

問題是什麼? – 2010-05-12 08:41:34

+2

'GameLoop()'返回? – 2010-05-12 08:50:04

+0

真的很愚蠢的問題,但你有一個Windows PROC來處理Windows消息,對吧? – zebrabox 2010-05-12 13:10:48

回答

6

我一直使用類似的東西:

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是實際遊戲LOPP實施onerror的()是一個錯誤處理程序(採用錯誤的描述作爲參數)和「奔跑」要麼是全局布爾變量或類成員。將「運行」設置爲false會關閉遊戲。

5

我認爲這真的取決於你的上下文。 Windows只會發送一個WM_QUIT來響應調用PostQuitMessage的應用程序。一個常見的(如果不是很好的話)解決方案是當程序想要結束時使用bool退出消息循環。

2

我想程序可能會要求用戶繼續或退出,在GameLoop函數內調用。在退出後將WM_QUIT消息發送到窗口。

PostMessage(hWnd, WM_QUIT, 0, 0); 

hWnd->遊戲窗口

別人撥打電話的手柄

DestroyWindow(hWnd); 

這會WM_DESTROY發送到您的窗口過程。在那裏你可以打電話

PostQuitMessage(0);