Графика для Windows средствами DirectDraw
Шрифт:
Сначала
Затем мы вызываем функцию ClearSurface и передаем ей два аргумента: указатель backsurf и 0. Это приводит к тому, что вторичный буфер заполняется черным цветом. Хотя я упоминал о том, что использование ClearSurface иногда осложняется различными форматами пикселей, заполнение поверхностей черным работает надежно. Для палитровых поверхностей 0 означает черный цвет, потому что по умолчанию он стоит в палитре на первом месте; для беспалитровых поверхностей 0 всегда соответствует черному цвету.
Функция DrawScene использует функцию DirectDrawWin::BltSurface для копирования поверхности surf1 на поверхность backsurf. Два последних аргумента BltSurface определяют точку поверхности-приемника, куда должно быть скопировано содержимое источника. Для выполнения этой операции можно было бы воспользоваться функцией Blt или BltFast интерфейса DirectDrawSurface, но мы не делаем этого из-за возможного отсечения. Обратите внимание - код, определяющий положение растра, позволяет источнику выйти за пределы приемника, в результате чего может потребоваться отсечение. Мы не можем воспользоваться функцией Blt, потому что тогда потребовалось бы присоединить к приемнику объект DirectDrawClipper, чего мы не делаем. Функция BltFast тоже не подходит, потому что она вообще не поддерживает отсечения. Функция BltSurface автоматически выполняет отсечение, а функции Blt и BltFast вызываются внутри нее.
Но перед тем, как переходить к функции BltSurface, мы закончим рассмотрение функции DrawScene. Она завершается вызовом функции Flip. При этом происходит переключение страниц, и подготовленный нами кадр отображается на экране. Функция Flip получает два аргумента: указатель на поверхность и переменную типа DWORD, предназначенную для установки флагов. Указатель на поверхность необходим лишь в нестандартных ситуациях, когда в переключении поверхностей участвует несколько вторичных буферов. Второй аргумент обычно содержит флаг DDFLIP_WAIT, показывающий, что возврат из функции должен происходить только после того, как переключение страниц завершится.
Функция BltSurface класса DirectDrawWin оказывается более гибкой и удобной по сравнению с функциями DirectDrawSurface::Blt и BltFast. Мы уже видели, как BltSurface используется внутри функции BounceWin::DrawScene, а сейчас рассмотрим саму функцию.
Функция BltSurface
требует передачи четырех аргументов, а пятый аргумент необязателен. Первые два аргумента представляют собой указатели на поверхности — источник и приемник. Следующие два аргумента — координаты x и y, определяющие положение копируемой области на приемнике. По умолчанию блиттинг выполняется без цветовых ключей, однако их можно активизировать с помощью необязательного пятого параметра. Код функции BltSurface приведен в листинге 3.3.Листинг 3.3. Функция BltSurface