我在win32 GDI中创建游戏mario。我已经实现了游戏的新循环:
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(鼠标光标正在滚动)。
答案 0 :(得分: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()是一个错误处理程序(将错误描述作为参数),“running”是全局bool变量或类成员。将“running”设置为false会关闭游戏。
答案 1 :(得分:5)
我认为这实际上取决于你的背景。 Windows将仅发送WM_QUIT以响应您的应用程序调用PostQuitMessage。这里常见的(如果不是很好的)解决方案是在程序想要结束时使用bool退出消息循环。
答案 2 :(得分:2)
我猜程序可能会要求用户继续或退出,在GameLoop函数调用中。在退出时将WM_QUIT消息发送到窗口。
PostMessage(hWnd, WM_QUIT, 0, 0 );
hWnd->游戏窗口的句柄
否则拨打
DestroyWindow(hWnd);
这将向您的窗口过程发送WM_DESTROY。你可以在那里打电话
PostQuitMessage(0);