Михаил Краснов - Графика DirectX в Delphi

Здесь есть возможность читать онлайн «Михаил Краснов - Графика DirectX в Delphi» — ознакомительный отрывок электронной книги совершенно бесплатно, а после прочтения отрывка купить полную версию. В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

Графика DirectX в Delphi: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Графика DirectX в Delphi»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Графика DirectX в Delphi — читать онлайн ознакомительный отрывок

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Графика DirectX в Delphi», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

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; // Результат, красный

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

wrkPointer^ := blue or (green shl 5) or (red shl 11);

end;

Result := FDDSBack.Unlock (nil);

end;

Вы должны обратить внимание, что фон в примере заполняется растянутым растровым изображением. Мы уже обсуждали проблему, связанную с использованием метода DDReLoad в таких случаях. Чтобы при распахивании минимизированного окна картинка не превращалась в мозаику, перезагрузим растр:

function TfrmDD.RestoreAll : HRESULT;

var

hRet : HRESULT; begin

hRet := FDDSPrimary._Restore;

if Succeeded (hRet) then begin

FDDSBackGround := nil; // Удаление поверхности

FDDSBackGround := DDLoadBitmap(FDD, groundBmp, ScreenWidth,

ScreenHeight); // Заново создаем поверхность фона

if FDDSBackGround = nil then ErrorOut(DD_FALSE, 'DDLoadBitmap');

if FDDSBackGround = nil then ErrorOut(DD_FALSE, 'DDLoadBitmap');

hRet := FDDSPrimary.Blt (nil, FDDSBackGround, nil, DDBLT_WAIT, nil);

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

Exit;

end;

Result := FDDSBack.Bit (nil, FDDSBackGround, nil, DDBLT_WAIT, nil);

end else Result := hRet;

end;

Картинка загружается заново, и в случае неудачи загрузки программа заканчивает работу.

Обратите внимание, что в примере растр для заполнения фона берется 24-битным, а второй, накладываемый, растр имеет разрядность 8 бит, т. е. используется 256-цветный рисунок. В таких случаях не требуется загружать палитру из этого рисунка, поскольку все цвета при переносе на 24-битную поверхность отображаются корректно. Формат пиксела первичной поверхности задает формат пиксела и для всех остальных поверхностей. Не должна возникать ситуация, когда на 8-битную первичную поверхность помещается 16-битный образ. Также палитра, устанавливаемая для первичной поверхности, задается для всех остальных поверхностей. В таких примерах мы не загружали и не устанавливали палитры ни для одной поверхности, кроме первичной. Из-за этого в примерах с летающим драконом его цвета немного искажались, для отображения использовалась палитра фоновой поверхности.

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

Использование полупрозрачности позволит придать нашим проектам потрясающую эффектность, такую, как в следующем, очень интересном, примере - проекте каталога Ех19. Идея такова: после запуска приложения содержимое рабочего стола копируется на первичную поверхность, а по ходу работы появляется полупрозрачное изображение. У пользователя создается ощущение того, что приложение осуществляет вывод прямо на рабочий стол. Но мы этого не делаем, иначе окно приложения нарушит иллюзию.

Для простоты накладываем одно ограничение: считаем разрешение экрана 16-битным, размеры рабочего стола - 640x480 пикселов. Обратите внимание на это, при других установках рабочего стола пример работает не так эффектно.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «Графика DirectX в Delphi»

Представляем Вашему вниманию похожие книги на «Графика DirectX в Delphi» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «Графика DirectX в Delphi»

Обсуждение, отзывы о книге «Графика DirectX в Delphi» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x