Я создаю игру mario как в win32 GDI. Я реализовал новый цикл для игры:
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 + Высокий звук + Del (курсор мыши прокручивается).
Я всегда использовал что-то вроде этого:
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, либо член класса. Установка значения false для «бега» завершает игру.
Я думаю, что это действительно зависит от контекста. Windows будет посылать WM_QUIT только в ответ на вызов вашим приложением PostQuitMessage. Общим (если не лучшим) решением здесь является использование bool для выхода из цикла сообщений, когда ваша программа хочет завершить работу.
Я предполагаю, что программа может попросить пользователя продолжить или выйти внутри вызова функции GameLoop. При выходе Выложить сообщение WM_QUIT в окно.
PostMessage(hWnd, WM_QUIT, 0, 0 );
hWnd-> Дескриптор игрового окна
иначе вызовет
DestroyWindow(hWnd);
. Это отправит WM_DESTROY вашей оконной процедуре. Там вы можете позвонить
PostQuitMessage(0);