Игровой цикл в окне GDI / не обновляется и вылетает через некоторое время

Это мой текущий игровой цикл в обычном окне:

while(running)
{
    while( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) )
    {
        if( msg.message == WM_QUIT )
        {
            running = false;
        }

        TranslateMessage( &msg );
        DrawGame(&game);
        DispatchMessage( &msg );
    }

    UpdateGame(&game);
    InvalidateRect(hwnd, NULL, 1);
    //Sleep(100);
}

... но стоит ли мне размещать DrawGame между Translate и DispatchMessage? Если я поставлю DrawGame выше / ниже UpdateGame, ничего не отрисовывается.

И через некоторое время, если я нарисую простой прямоугольник, они начнут накладываться друг на друга. Он работает нормально около минуты, нарисуйте сетку прямоугольников (смещенную из-за: установленный вами размер окна не соответствует размеру окна. И через некоторое время он рисует другую сетку, а иногда и полностью портит окно похоже, что произошел сбой, и я должен нажать кнопку «стоп» в Visual Studio.

Итак, где именно мне разместить игровой цикл и как узнать, когда рисовать игру? В первую очередь мне нужно нарисовать прямоугольники, хотя это тоже не очень хорошо работает.


person Deukalion    schedule 06.08.2012    source источник


Ответы (1)


Вы должны вызвать DrawGame () из обратного вызова сообщения Windows при обработке сообщения WM_PAINT.

В цикле сообщений вы должны только получать и отправлять сообщения Windows соответствующему обратному вызову.

Кроме того, это также место для обновления игрового мира, но не для выполнения вызовов отрисовки.

person Paulo Pinto    schedule 06.08.2012