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



интерфейса DirectDrawSurface). Наконец, переменная framecount (предназначенная для подсчета кадров за текущий интервал хронометража) обнуляется, а логической переменной displayfps присваивается значение FALSE, согласно которому поверхность FPS пока не должна отображаться на экране.

Хотя мы создали поверхность fpssurf, она осталась неинициализированной. В отличие от поверхности menusurf, инициализируемой функцией UpdateMenuSurface(), мы пока не можем инициализировать поверхность FPS, потому что у нас еще нет выводимого значения. Приложение только что было запущено (или только что перешло в другой видеорежим), так что вывод любого значения FPS был бы необоснованным.

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

Графический вывод

Графическим выводом в программе Switch занимается функция SwitchWin::DrawScene(). Она отвечает за подготовку кадра во вторичном буфере и переключение страниц, благодаря которому новый кадр отображается на экране. Код функции DrawScene() содержится в листинге 4.4.


Листинг 4.4. Функция SwitchWin::DrawScene()

>void SwitchWin::DrawScene() {

> ClearSurface(backsurf, 0);

> BltSurface(backsurf, bmpsurf, x, y);

> x+=xinc;

> y+=yinc;

> const CRect& displayrect=GetDisplayRect();

> if (x<-160 || x>displayrect.right-160) {

>  xinc=-xinc;

>  x+=xinc;

> }

> if (y<-100 || y>displayrect.bottom-100)  {

>  yinc=-yinc;

>  y+=yinc;

> }

> backsurf->BltFast(0, 0, menusurf, 0,    DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT);

> UpdateFPSSurface();

> if (displayfps) {

>  int x=displayrect.right-fpsrect.right-1;

>  int y=displayrect.bottom-fpsrect.bottom-1;

>  backsurf->BltFast(x, y, fpssurf, 0, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT );

> }

> primsurf->Flip(0, DDFLIP_WAIT);

>} 

Сначала функция DrawScene() подготавливает вторичный буфер, стирая его содержимое функцией ClearSurface(). Мы заполняем вторичный буфер нулями, но, поскольку он не имеет цветового ключа, 0 в данном случае имеет иной смысл, чем для поверхностей menusurf и fpssurf. Для вторичных буферов 0 означает черный цвет (в большинстве случаев).

СОВЕТ

Черный цвет не гарантирован 

По умолчанию DirectDraw резервирует два элемента палитры: для черного (индекс 0) и для белого (индекс 255). Поэтому обычно заполнение поверхности нулями равносильно ее заливке черным цветом. Тем не менее в палитрах, созданных с флагом