Графика для Windows средствами DirectDraw | страница 78
Хотя мы создали поверхность 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). Поэтому обычно заполнение поверхности нулями равносильно ее заливке черным цветом. Тем не менее в палитрах, созданных с флагом