Мир программирования

 


Найти: на:


Меню
Партнеры
Счетчики
Реклама

Direct Draw по русски
Как создавать поверхности DirectDraw


Для того, чтобы создать хоть одну поверхность, нужно представлять себе, что же это такое. DirectDraw - представляет из себя интерфейс устройства (в данном случае - видеокарты) и предлагает нам для работы так называемые поверхности, над которыми мы можем производить всяческие операции. Для успешной работы любого приложения нам необходимо (!!!) иметь по крайней мере ДВЕ поверхности. Одну - первичную (PrimarySurface) и соответственно вторичную. Пользователь всегда видит перед собой первичную поверхность. В это же самое время мы можем спокойно рисовать на вторичной поверхности все, что нам вздумается. И как только мы все нарисовано, мы просто переносим готовое изображение со вторичной поверхности на первичную. Все! В этом - то и заключается вся суть DirectDraw.

Другое дело КАК мы можем переключать поверхности. Нужно сказать, что первичная поверхность обладает одним (из многих) хорошим свойством. Она может присоединять к себе другие поверхности. Что же у нас получается? Если мы создаем первичную поверхность, а затем присоединим к ней еще одну, то у нас появляются две “страницы”, которые будут переключаться между собой методом flip. Если же мы присоединим еще одну поверхность, то теперь метод flip будет переключать их по порядку.

Итак. Приступим к созданию поверхностей. Первое, что нам нужно сделать, это убедиться, что в Uses включен модуль DDraw. Если это до сих пор не сделано, то я прямо и не знаю, что дальше-то будет.

Uses DDraw, . . . . . . ;

Следующим шагом будет определение объектов DirectDraw.

var

. . . . .

DDResult : Hresult; // Сюда возвращается флаг результата после каждой операции

// при инициализации объектов DirectDraw

DDrawObject : IDirectDraw; // Это ключевой объект !!! Без него все напрасно.

PrimarySurface : IDirectDrawSurface; //Объявили первичную поверхность

SecondarySurface : IDirectDrawSurface; //Объявили вторичную поверхность

SurfaceDescription: TDDSurfaceDesc; // Этот объект нам потребуется при создании самих поверхностей

// в этой структуре описывается структура (масло масляное :-))

// будущей поверхности. Она используется многократно.

BackCaps: TDDSCaps; // Это флаг, который указывает режим для вторичной поверхности

Описание мы закончили, теперь начнем сроить эти самые поверхности.

begin

. . . . .

{здесь мы написали код создания нашего приложения}

. . . . .

DDResult := DirectDrawCreate (nil,DDrawObject,nil);

// Создаи управляющий объект DirectDraw !!!

DDResult := DDrawObject.SetCooperativeLevel (handle, DDSCL_EXCLUSIVE or DDSCL_FULLSCREEN);

 

// Установили флаги приоритета

DDResult := DDrawObject.SetDisplayMode (640,480,16);

// Установили видеорежим

{Начинаем описывать первичную поверхность}

with SurfaceDescription do begin

dwSize := sizeof(SurfaceDescription); // заносим в поле dwSize размер структуры

dwFlags := DDSD_CAPS or DDSD_BACKBUFFERCOUNT;

// Устанавливаем флаги используемые этой поверхностью

ddsCaps.dwCaps :=DDSCAPS_PRIMARYSURFACE or DDSCAPS_FLIP or DDSCAPS_COMPLEX;

// Установили свойство свича, как первичная, переключаемая поверхность.

DwBackBufferCount := 1;

// Наша первичная поверхность имеет одну вторичную.

end;

DDResult := DDrawObject.CreateSurface (SurfaceDescription,PrimarySurface,nil);

// Ну вот мы и создали первичную поверхность

{Теперь еще легче. Теперь нам нужно просто подключить вторичную поверхность к первичной.}

BackCaps.dwCaps := DDSDCAPS_BACKBUFFER;

// Указываем, что создаваемая нами поверхность является вне экранной (невидимой)

PrimarySurface.GetAttachedSurface (BackCaps,SecondarySurface);

// Ну вот, наконец то присоединили вторую поверхность

// Чтобы проверить, действительно ли происходит переключение между поверхностями

// напишем

PrimarySurface.Flip(nil, DDFLIP_WAIT);

. . . . . .

end.

Вроде бы все, но нет!!! Не торопитесь запускать программу. Мы же с Вами так и не написали процедуру уничтожения поверхностей. Так давайте же её поскорее напишем.

procedure FreeAll;

begin

SecondarySurface._Release;

pointer(SecondarySurface):=nil;

PrimarySurface._Release;

pointer(PrimarySurface):=nil;

DDrawObject._Release;

pointer(DDrawObject):=nil;

end;

Вот теперь можно запустить программку и воочию убедится, что на вторичной поверхности содержится всякая белиберда. У меня например это похоже на несоответствие кадровой развертки моему типу монитора. Продолжение здесь.

Опрос

Конкурсы
Реклама

 

Web дизайн: Бурлаков Михаил    

Web программирование: Бурлаков Михаил

Используются технологии uCoz