Игровой цикл в Win32 API

Я создаю игру 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 (курсор мыши прокручивается).

5
задан Jonas 5 February 2012 в 00:50
поделиться

3 ответа

Я всегда использовал что-то вроде этого:

    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 для «бега» завершает игру.

6
ответ дан 18 December 2019 в 14:43
поделиться

Я думаю, что это действительно зависит от контекста. Windows будет посылать WM_QUIT только в ответ на вызов вашим приложением PostQuitMessage. Общим (если не лучшим) решением здесь является использование bool для выхода из цикла сообщений, когда ваша программа хочет завершить работу.

5
ответ дан 18 December 2019 в 14:43
поделиться

Я предполагаю, что программа может попросить пользователя продолжить или выйти внутри вызова функции GameLoop. При выходе Выложить сообщение WM_QUIT в окно.

PostMessage(hWnd, WM_QUIT, 0, 0 );

hWnd-> Дескриптор игрового окна

иначе вызовет

DestroyWindow(hWnd);

. Это отправит WM_DESTROY вашей оконной процедуре. Там вы можете позвонить

PostQuitMessage(0);     
2
ответ дан 18 December 2019 в 14:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: