Программирование графики

Xakep, номер #040, стр. 040-075-2


Ну, в общем, все в таком духе. Мы начнем изучение с 2D графики и, соответственно, с Ddraw.dll.

DirectX - это объектная библиотека, построенная по технологии COM. Не пугайся, я постараюсь объяснить все как можно проще, чтобы ты не ощутил всех трудностей COM кодинга. DirectDraw, грубо говоря, состоит из следующих объектов:

DirectDrawSurface - область видеопамяти. К ней можно обращаться напрямую и производить практически любые действия.

DirectDrawPalette - интерфейс для работы с палитрами. Он нужен, если ты настроился на 256- или, не дай бог, 16-цветную игру.

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

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

Пошкодим

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

Для начала в раздел var добавь следующие переменные:

var

...

...

FDirectDraw : IDirectDraw7;

FPrimarySurface : IDirectDrawSurface7;

SurfaceDesc : TDDSurfaceDesc2;

hRet : HRESULT;

DC : HDC;

bltfx : TDDBLTFX;

Чуть позже ты узнаешь, зачем они нужны. А сейчас пойди в раздел uses и добавь недостающие модули:

uses windows, Graphics, messages, sysutils, DirectDraw;

Здесь DirectDraw - это файл DirectDraw.pas, в котором описаны все функции для работы с графической библиотекой. Если у тебя нет этого файла, то ты сможешь его скачать с моего сайта. Я даже тебе советую сделать это в любом случае, потому что разные версии этого файла работают по-разному, и могут возникнуть проблемы с компиляцией.

Инициализация

Теперь перейди туда, где написан комментарий "Здесь можно производить инициализацию", это перед циклом обработки сообщений. Вот здесь мы начнем DX кодинг.

Первое, что нужно сделать, - проинициализировать сам DirectDraw:

hRet := DirectDrawCreateEx (nil, FDirectDraw, IDirectDraw7, nil);

if hRet <> DD_OK then Halt;

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

У функции DirectDrawCreateEx есть четыре параметра:

1. Используемый для вывода драйвер. Возможные значения: DDCREATE_HARDWAREONLY - использовать только аппаратные возможности; DDCREATE_EMULATIONONLY - использовать только эмуляцию; nil - использовать аппаратные возможности и эмуляцию.

2. Указатель на переменную типа TDirectDraw, которая будет инициализирована.

3. Версия DirectDraw, которую мы хотим получить. Сейчас существует уже 8-я версия, но указывать надо именно IDirectDraw7.

Назад на стр. 040-075-1  Содержание  Вперед на стр. 040-075-3