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

Вывод спрайтов

Xakep, номер #041, стр. 041-077-2


А почему я присвоил nil, а не простой 0 (ноль)? Ноль мы можем присваивать числовым переменным, а переменные объекта - это не числа. На самом деле это указатели на область памяти, где расположен сам объект. Когда ты его создаешь, то выделяется необходимая для хранения объекта память и переменной присваивается только ссылка. Когда ты уничтожаешь объект, память освобождается и ссылка обнуляется.

Загрузка изображения

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

Вместе с заголовочными файлами ты можешь найти файл ddutil.pas. В нем уже реализовано много стандартных операций, которые могут тебе понадобиться, в том числе и загрузка изображения. Сразу хочу сказать, что модуль написан не мной и не Васей Пупкиным, а всеми нелюбимой корпорашкой MS, так что его реализация есть и для языков С/С++.

Перейди в раздел uses и добавь туда имя этого модуля. Теперь можно загружать что угодно. После создания первичной поверхности и перед циклом обработки сообщений напиши следующее:

FImageSurface := DDLoadBitmap(FDirectDraw, '1.bmp', 0, 0);

Здесь я вызываю функцию DDLoadBitmap, которая описана в модуле ddutil.pas. У нее четыре параметра:

1. Уже созданный объект DirectDraw.

2 Имя (если надо, то и путь) файла. Если путь не указывать, то изображение должно лежать в той же директории, что и запускной файл.

3, 4. Последние два параметра - это желаемые ширина и высота картинки. Если ты укажешь здесь какие-нибудь значения, отличные от нуля, то картинка будет приведена именно к этим размерам. Если указать нули, то будут использоваться реальные размеры изображения.

Я специально не создавал поверхность FimageSurface вручную (не вызывал явно метод CreateSurface), потому что если это необходимо, то DDLoadBitmap сама проинициализирует ее. Ручной труд тут уместен, только если ты хочешь создать что-то специфическое, а нас пока устроят и значения по умолчанию.

Обрисуем всю планету

Изображение готово, и можно приступать к его выводу на экран. Это желательно делать по событию системы WM_PAINT, которое происходит при необходимости прорисовать окно.

if msg=WM_PAINT then

begin

// Обнуляю структуру bltfx

ZeroMemory(@bltfx, SizeOf(bltfx));

//Заполняю ее размер

bltfx.dwSize := sizeof(bltfx);

//Цвет заливки

bltfx.dwFillColor := 0;

//Закрашиваю фон

FPrimarySurface.Blt(nil, nil, nil, DDBLT_COLORFILL or DDBLT_WAIT, @bltfx);

//Вывожу на экран изображение

FPrimarySurface.BltFast (175, 75, FImageSurface, nil, DDBLTFAST_WAIT);

end;

Давай разберемся с этим текстом. Первым делом я заполняю структуру bltfx, которая у меня объявлена в разделе var в виде типа TDDBLTFX. Это очень сложная структура, которая используется при вызове функции поверхности Blt, которая тоже, в свою очередь, достаточно сложная и имеет множество возможностей.

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