Создание поверхностей

"Теория DirectDraw"

<Уголок DirectX>


Создание главной поверхности

Главной называется поверхность, видимая пользователем на мониторе. Она идентифицируется флагом DDSCAPS_PRIMARYSURFACE. Вы можете иметь только одну главную поверхность для каждого объекта DirectDraw.

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

Вот пример задания описания главной поверхности перед ее созданием:

ddsd.lFlags=DDSD_CAPS
ddsd.ddsCaps.lCaps = DDSCAPS_PRIMARYSURFACE

Здесь ddsd - это тип DDSURFACEDESC2, в который заносится информация о поверхности. Чаще всего он используется перед совершением какого-либо действия над поверхностями.

После задания описания, вызывается метод создания поверхности DirectDraw7.CreateSurface с параметром, указывающим на заполненную структуру DDSURFACEDESC2

 

Создание заднего буфера

Задний буфер - это как бы полотно, на котором происходит "сбор" спрайтов, фона, эффектов и т.п. очередного кадра. Затем, задний буфер полностью "переводится" на главную поверхность. Эта операция называется флиппинг.

Задний буфер обычно создают вместе с главной поверхностью, он получается как бы прикрепленным к ней. Такой "симбиоз" главной поверхности с одним или несколько задним буфером называется flipping-chain.

Набор поверхностей, создаваемых одним вызовом метода CreateSurface называется комплексной поверхностью. Такие поверхности могут управляться также только одним вызовом метода. Создание flipping-chain наиболее частое применение комплексных поверхностей.

Вот пример, как можно создать главную поверхность с прикрепленным задним буфером:

'Создать главную поверхность
ddsd.lFlags = DDSD_CAPS Or DDSD_BACKBUFFERCOUNT
ddsd.ddsCaps.lCaps = DDSCAPS_PRIMARYSURFACE Or DDSCAPS_FLIP Or DDSCAPS_COMPLEX
ddsd.lBackBufferCount = 1
Set Primary = dd.CreateSurface(ddsd)

'Получить задний буфер
caps.lCaps = DDSCAPS_BACKBUFFER
Set BackBuffer = Primary.GetAttachedSurface(caps)

Здесь caps - это тип DDCAPS2, dd - DirectDraw7, Primary и BackBuffer - DirectDrawSurface7

 

Создание оффскринных поверхностей

Оффскринные (невидимые) поверхности часто используются для хранения (кэширования) изображений, которые потом будут перенесены на задний буфер. Вы должны объявить размеры оффскринной поверхности, включив флаги DDSC_WIDTH и DDSD_HEIGHT, а также значения членов lWidth и lHeight структуры DDSURFACEDESC2. Еще, вы должны указать флаг DDSCAPS_OFFSCREENPLAIN, в типе DDSCAPS, содержащемся в структуре DDSURFACEDESC2.

По-умолчанию, DirectDraw создает поверхность в видеопамяти, если только она полностью не занята. В противном случае, поверхность создается в системной памяти. Вы сами можете указать в какой памяти создавать поверхность, указав флаги DDSCAPS_SYSTEMMEMORY или DDSCAPS_VIDEOMEMORY в типе DDSCAPS, содержащемся в структуре DDSURFACEDESC2.

В этом примере показано как подготовить создание простой оффскринной поверхности 100x100:

ddsd.lFlags=DDSD_CAPS or DDSD_HEIGHT or DDSD_WIDTH
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN
ddsd.lHeight = 100
ddsd.lWidth = 100

 

Создание больших поверхностей

DirectDraw начиная с версии DirectX 5 позволяет создавать оффскринные поверхности, которые больше, чем главная поверхность. Однако это возможно только тогда, когда дисплейное оборудование позволяет делать это.

Чтобы проверить, поддерживает ли оборудование пользователя большие поверхности, вызовите метод DirectDraw7.GetCaps и посмотрите на наличие флага DDCAPS2_WIDESURFACES в члене lCaps2 первой структуры DDCAPS, которую вы передали при вызове. Если флаг присутствует, вы можете создавать большие поверхности.


>>> Реклама <<<