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

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

5 голосов
/ 12 мая 2010

Я создаю игру Марио, как в 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 + Alt + Del (курсор мыши вращается).

Ответы [ 3 ]

6 голосов
/ 12 мая 2010

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

    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 отключает игру.

5 голосов
/ 12 мая 2010

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

2 голосов
/ 12 мая 2010

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

PostMessage(hWnd, WM_QUIT, 0, 0 );

hWnd-> Ручка игрового окна

еще позвоните на

DestroyWindow(hWnd);

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

PostQuitMessage(0);     
...