2010-05-12 118 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);