Чтение онлайн

на главную - закладки

Жанры

Графика DirectX в Delphi

Краснов Михаил

Шрифт:

Если Alpha равно нулю, то получаем цвет приемника; если Alpha имеет единичное значение, источник совершенно непрозрачен. Если мы имеем дело с образом, двигающимся по поверхности, то под источником подразумеваем образ, а фон считаем приемником.

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

Result = Alpha * srcColor + destColor - Alpha * destColor

ИЛИ

Result = Alpha * (srcColor - destColor) + destColor

Коэффициент

прозрачности имеет смысл представлять целым, чтобы все вычисления производить только с целыми числами. Считая Alpha целым в интервале 0 - 256, окончательную формулу расчета составляющей запишем так:

Result = (Alpha * (srcColor - destColor)) / 256 + destColor

Все предваряющие слова сказаны, можем перейти к иллюстрации - проекту каталога Ех18, при работе которого по знакомому фону перемещается полупрозрачный образ насекомого (рис. 3.8).

Массив Pict содержит битовую карту растра:

const

imageWidth = 84;

imageHeight = 80;

Alpha = 127; var

Pict : Array [0..imageWidth - 1, 0..imageHeight - 1] of Word;

ColorKey : Word; // Вспомогательный цветовой ключ

Поверхность образа не выводится на экран, а служит только для заполнения массива pict:

function TfrmDD.Prepare : HRESULT;

var

desc : TDDSURFACEDESC2;

i, j : Integer;

hRet : HRESULT; begin

Result := DD_FALSE;

ZeroMemory (@desc, SizeOf(desc) );

desc.dwSize := SizeOf(desc);

hRet := FDDSImage.Lock (nil, desc, DDLOGK_WAIT, 0);

if Failed (hRet) then begin Result := hRet;

Exit;

end;

// Заполнение массива Pict

for i := 0 to imageWidth - 1 do

for j := 0 to imageHeight - 1 do

Pict [i, j] := PWORD (Integer (desc.IpSurface) + j * desc.lPitch + i * (ScreenBitDepth div 8))^;

ColorKey := Pict [0,0]; // Определяемся с цветовым ключом

Result := FDDSImage.Unlock (nil);

end;

Для простоты в качестве цветового ключа возьмем значение самого первого пиксела образа, считая, что цвет его совпадает с цветом фона. Для ускорения работы примера воспользуемся приемом с частичным обновлением экрана:

function TfrmDD.UpdateFrame : HRESULT;

var

X, Y : Integer; wrkRect : TRECT; hRet : HRESULT;

begin

ThisTickCount := GetTickCount;

if ThisTickCount - LastTickCount > 60 then begin X := 288 + trunc (cos(Angle) * 150);

Y := 208 + trunc (sin(Angle) * 150);

//

Старая позиция образа

SetRect (wrkRect, X, Y, X + imageWidth, Y + imageHeight);

Angle := Angle + 0.05;

if Angle > 2 * Pi then Angle := Angle -2 * Pi;

// Вывод полупрозрачного образа в задний буфер

hRet := Blend (288 + trunc (cos(Angle) * 150),

208 + trunc (sin(Angle) * 150)); if Failed (hRet) then begin Result := hRet;

Exit;

end;

// Переключаем страницы hRet := FlipPages;

if Failed (hRet) then begin Result := hRet;

Exit;

end;

// Стираем образ в заднем буфере

hRet := FDDSBack.Blt (@wrkrect, FDDSBackGround, SwrkRect,

DDBLT_WAIT, nil); if Failed (hRet) then begin

Result := hRet;

Exit;

end;

LastTickCount := GetTickCount;

end;

Result := DD_OK;

end;

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

function TfrmDD.Blend (const X, Y : Integer) : HRESULT;

var

desc : TDDSURFACEDESC2; i, j : Integer;

wrkPointer : PWORD;

sTemp, dTemp : WORD;

sb, db, sg, dg, sr, dr : Byte;

blue, green, red : Byte;

hRet : HRESULT;

begin

ZeroMemory (@desc, SizeOf (desc) ) ; desc.dwSize := SizeOf(desc);

hRet := FDDSBack.Lock (nil, desc, DDLOCK_WAIT, 0) ;

if Failed (hRet) then begin Result := hRet;

Exit;

end;

for i := 0 to imageWidth - 1 do

for j := 0 to imageHeight - 1 do

// Только для точек с цветом, отличным от цвета фона if Pict [i, j] <> ColorKey then begin

wrkPointer := PWORD (Integer(desc.IpSurface) +

(Y + j) * desc.lPitch + (X + i) * (ScreenBitDepth div 8));

sTemp := Pict [i, j]; // Пиксел источника, точка образа

dTemp := wrkPointer^; // Приемник, фоновая картинка

sb = sTemp and $lf; // Синий цвет источника

db = dTemp and $lf; // Синий цвет приемника

sg = (sTemp shr 5) and $3f; // Зеленый цвет источника

dg = (dTemp shr 5) and $3f; // Зеленый цвет приемника

sr = (sTemp shr 11) and $lf; // Красный цвет источника

dr = (dTemp shr 11) and $lf; // Красный цвет приемника

blue := (ALPHA * (sb - db) shr 8) -t- db; // Результат, синий

green := (ALPHA * (sg - dg) shr 8) + dg; // Результат, зеленый

red := (ALPHA * (sr - dr) shr 8) + dr; // Результат, красный

// Сложение цветовых компонентов в пикселе приемника

Поделиться:
Популярные книги

Газлайтер. Том 10

Володин Григорий
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

На границе империй. Том 7. Часть 2

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2

Звездная Кровь. Изгой

Елисеев Алексей Станиславович
1. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Звездная Кровь. Изгой

Хозяин Теней 4

Петров Максим Николаевич
4. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 4

Картофельное счастье попаданки

Иконникова Ольга
Фантастика:
фэнтези
5.00
рейтинг книги
Картофельное счастье попаданки

Экзорцист: Проклятый металл. Жнец. Мор. Осквернитель

Корнев Павел Николаевич
Фантастика:
фэнтези
героическая фантастика
5.50
рейтинг книги
Экзорцист: Проклятый металл. Жнец. Мор. Осквернитель

Доктора вызывали? или Трудовые будни попаданки

Марей Соня
Фантастика:
юмористическая фантастика
попаданцы
5.00
рейтинг книги
Доктора вызывали? или Трудовые будни попаданки

Метатель

Тарасов Ник
1. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель

Моя на одну ночь

Тоцка Тала
Любовные романы:
современные любовные романы
короткие любовные романы
5.50
рейтинг книги
Моя на одну ночь

Чехов. Книга 2

Гоблин (MeXXanik)
2. Адвокат Чехов
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Чехов. Книга 2

Хозяин Теней 2

Петров Максим Николаевич
2. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 2

Сумеречный стрелок 7

Карелин Сергей Витальевич
7. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный стрелок 7

Жизнь под чужим солнцем

Михалкова Елена Ивановна
Детективы:
прочие детективы
9.10
рейтинг книги
Жизнь под чужим солнцем

Красноармеец

Поселягин Владимир Геннадьевич
1. Красноармеец
Фантастика:
боевая фантастика
попаданцы
4.60
рейтинг книги
Красноармеец