Чтение онлайн

на главную - закладки

Жанры

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

Трухильо Стэн

Шрифт:

В последний аргумент функции BltFast включены флаги DDBLTFAST_SRCCOLORKEY и DDBLTFAST_WAIT. Первый флаг активизирует цветовой ключ поверхности-источника. Если бы он не был указан, то во время блиттинга цветовой ключ поверхности menusurf был бы проигнорирован, а пиксели с нулевыми значениями выводились бы черным цветом. Второй флаг показывает, что выход из функции BltFast должен произойти лишь после завершения копирования.

Вернемся к функции DrawScene.

Наша следующая задача - обновление и отображение поверхности FPS (fpssurf). Однако, как было сказано выше, поверхность fpssurf обновляется лишь после того, как закончится очередной интервал хронометража.

Вычисление FPS и подготовка поверхности осуществляются функцией UpdateFPSSurface, вызываемой функцией DrawScene при каждом обновлении экрана. Функция UpdateFPSSurface выглядит так:

BOOL SwitchWin::UpdateFPSSurface {

 static const long interval=100;

 framecount++;

 if (framecount==interval) {

static DWORD timenow;

static DWORD timethen;

timethen=timenow;

timenow=timeGetTime;

double seconds=double(timenow-timethen)/(double)1000;

int fps=(int)((double)framecount/seconds);

static char buf[10];

int len=sprintf(buf, "%d FPS", fps);

ClearSurface(fpssurf, 0);

HDC hdc;

fpssurf->GetDC(&hdc);

SelectObject(hdc, smallfont);

SetBkMode(hdc, TRANSPARENT);

SetBkColor(hdc, RGB(0,0,0));

SetTextColor(hdc, textshadow);

TextOut(hdc, 1, 1, buf, len);

SetTextColor(hdc, brighttextcolor);

TextOut(hdc, 0, 0, buf, len);

fpssurf->ReleaseDC(hdc);

displayfps=TRUE;

framecount=0;

 }

 return TRUE;

}

Функция UpdateFPSSurface использует переменную framecount для подсчета выведенных кадров. Переменная framecount обнуляется в двух случаях: при изменении видеорежима и при обновлении поверхности fpssurf заново вычисленным значением FPS.

Каждый раз, когда заданное количество кадров будет подготовлено и выведено на экран, функция timeGetTime

подсчитывает количество прошедших миллисекунд. По этой величине определяется текущий FPS приложения.

Значение FPS преобразуется в строку и выводится на поверхность FPS (после предварительной очистки поверхности функцией ClearSurface). После вывода текста переменная framecount обнуляется, и начинается новый интервал хронометража. Наконец, переменной displayfps присваивается значение TRUE; оно говорит о том, что на поверхности FPS находится допустимое значение, которое следует вывести на экран.

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

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);

Если флаг displayfps равен TRUE, поверхность FPS следует вывести на экран. Однако сначала мы рассчитываем ее положение по известным размерам видеорежима и поверхности. Затем мы копируем поверхность fpssurf функцией BltFast, после чего выводим на экран вторичный буфер функцией Flip интерфейса DirectDrawSurface.

Задача функции DrawScene выполнена — все три поверхности программы Switch выведены на экран. Тем не менее изучение приложения еще не закончено. Мы должны рассмотреть обработку пользовательского ввода.

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

Обработка пользовательского ввода 

При запуске программы Switch текст в нижней части меню подсказывает, какие клавиши управляют работой приложения. Клавиши со стрелками изменяют текущий выделенный видеорежим, клавиша Enter активизирует его (если он не является текущим), а клавиша Escape завершает работу программы. Все эти клавиши обрабатываются функцией OnKeyDown, создаваемой ClassWizard. Ее код приведен в листинге 4.5.

Поделиться:
Популярные книги

Идеальный мир для Лекаря 8

Сапфир Олег
8. Лекарь
Фантастика:
юмористическое фэнтези
аниме
7.00
рейтинг книги
Идеальный мир для Лекаря 8

Последняя Арена 6

Греков Сергей
6. Последняя Арена
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Последняя Арена 6

По воле короля

Леви Кира
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
По воле короля

Душелов. Том 4

Faded Emory
4. Внутренние демоны
Фантастика:
юмористическая фантастика
ранобэ
фэнтези
фантастика: прочее
хентай
эпическая фантастика
5.00
рейтинг книги
Душелов. Том 4

Темный Лекарь 2

Токсик Саша
2. Темный Лекарь
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Темный Лекарь 2

Эволюция мага

Лисина Александра
2. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эволюция мага

(Не) моя ДНК

Рымарь Диана
6. Сапфировые истории
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
(Не) моя ДНК

Протокол "Наследник"

Лисина Александра
1. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Протокол Наследник

Измена. Наследник для дракона

Солт Елена
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Измена. Наследник для дракона

Неудержимый. Книга II

Боярский Андрей
2. Неудержимый
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Неудержимый. Книга II

Камень. Книга 4

Минин Станислав
4. Камень
Фантастика:
боевая фантастика
7.77
рейтинг книги
Камень. Книга 4

Измена. Право на сына

Арская Арина
4. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Право на сына

Инквизитор Тьмы 4

Шмаков Алексей Семенович
4. Инквизитор Тьмы
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Инквизитор Тьмы 4

Кротовский, сколько можно?

Парсиев Дмитрий
5. РОС: Изнанка Империи
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Кротовский, сколько можно?