Графика для Windows средствами DirectDraw


Функция DrawScene()



Инициализация приложения завершена, теперь можно заняться функцией DrawScene(). Эта функция выполняет проверку столкновений, строит кадр во вторичном буфере и переключает страницы. В программе Bumper() функция DrawScene() выглядит так:


void BumperWin::DrawScene() { ASSERT(nsprites>0); ASSERT(text);

for (int s1=0;s1<nsprites;s1++) for (int s2=s1+1;s2<nsprites;s2++) if (SpritesCollide( sprite[s1], sprite[s2] )) { sprite[s1]->Hit( sprite[s2] ); sprite[s2]->Hit( sprite[s1] ); }

for (int i=0;i<nsprites;i++) sprite[i]->Update();

ClearSurface( backsurf, 0 ); for (i=0;i<nsprites;i++) { Sprite* s=sprite[i]; BltSurface( backsurf, *s, s->GetX(), s->GetY(), TRUE ); }

BltSurface( backsurf, text, 0, 448, TRUE );

primsurf->Flip( 0, DDFLIP_WAIT ); }


Проверка столкновений осуществляется во вложенном цикле. Для каждой пары спрайтов вызывается функция SpritesCollide(), а при обнаруженном столкновении вызывается функция Hit(), которой в качестве аргументов передаются оба столкнувшихся спрайта. Напомню, что функция Sprite::Hit()

реализует стадию подтверждения в нашей модели проверки столкновений. Она сохраняет данные о столкновении, но не вносит никаких изменений в состояние спрайтов.

В отдельном цикле для каждого спрайта вызывается функция Update(). На этом шаге реализуется стадия реакции. При обнаруженном столкновении функция Update() определяет новую траекторию спрайта по сохраненным ранее данным. Кроме того, функция Update() изменяет текущее положение спрайта.

После того как все столкновения будут обнаружены и обработаны, мы стираем вторичный буфер функцией DirectDrawWin::ClearSurface() и выводим каждый спрайт функцией BltSurface(). Обратите внимание на то, что вторым аргументом BltSurface() является указатель на сам объект Sprite. В данном случае оператор LPDIRECTDRAWSURFACE() преобразует объект Sprite

в указатель на поверхность, соответствующую данному спрайту. Также стоит заметить, что координаты спрайтов определяются функциями GetX() и GetY(). После прорисовки всех спрайтов в левом нижнем углу вторичного буфера выводится поверхность меню. Функция Flip() переключает страницы и отображает кадр на экране.




Начало  Назад  Вперед