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

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

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

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

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

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

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

Интервал:

Закладка:

Сделать

else FDDSBack.BltFast (220, 140 - trunc (sin (Angle + Pi / 4) * 100),

FDDSImageSphere, nil, DDBLTFAST_WAIT);

if wrkl = 3

then FDDSBack.BltFast (440, 140 - trunc (sin (Angle + Pi / 2) * 100),

FDDSImageSelect, nil, DDBLTFAST_WAIT)

else FDDSBack.BltFast (440, 140 - trunc (sin (Angle + Pi / 2) * 100),

FDDSImageSphere, nil, DDBLTFAST_WAIT);

// Вывод указателя курсора

FDDSBack.BltFast (mouseX, mouseY, FDDSMouse, nil,

DDBLTFAST_WAIT or DDBLTFAST_SRCCOLORKEY);

if Failed (FlipPages)

then Result := RestoreAll

else Result := DD_OK;

end;

Теперь посмотрим функцию выбора:

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

var

desc : TDDSURFACEDESC2;

Red, Green, Blue : Byte;

Pixel : Word;

begin

Result := -1;

ZeroMemory (@desc, SizeOf(desc));

desc.dwSize := SizeOf(desc) ;

if Failed (FDDSDouble.Lock (nil, desc, DDLOCK_WAIT, 0))

then Exit; // Закрыть не удается, выходим

Pixel := PWord (Integer (desc.IpSurface) + У * desc.lPitch + X * 2)^;

Blue := Pixel and $1F; // Цветовые компоненты пиксела

Green := (Pixel shr 5) and $3F; Red := (Pixel shr 11) and $1F; FDDSDouble.Unlock (nil);

if Blue <> 0 then Result := 3 else // Анализируем результат if Green <> 0 then Result := 2 else

if Red <> 0 then Result := 1 else Result := 0;

end;

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

В рассмотренном примере фон не используется. Но если он потребуется, то учтите, что на вспомогательную поверхность его выводить совершенно не нужно.

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

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

Лупа

В данном разделе мы рассмотрим два любопытных примера, посвященных организации лупы. Задача сама по себе занимательна, но вдобавок мы узнаем кое-что интересное и загадочное.

Запустите проект, располагающийся в каталоге Ех21. По экрану перемещается "лупа", кружок, в пределах которого выводится увеличенный участок фона (рис. 3.10).

В качестве фона в примерах этого раздела я использую с любезного разрешения - фото 18

В качестве фона в примерах этого раздела я использую, с любезного разрешения автора, работы художника, имя которого присутствует в левом нижнем углу растрового изображения. Псевдоним автора - Beardo, а адрес ею страницы http://home5.swipnet.se/~w-57902/images/art/.

Изобразить увеличенный участок фона - задача не из трудных, мы хорошо усвоили метод Bit поверхности. Проблема состоит в том, чтобы вывести не прямоугольную, а именно круглую лупу. Посмотрим, как это сделано в данном примере.

Поверхность, связанная с лупой, называется FDDSZoom, для нее установлен цветовой ключ - черный цвет. Размер поверхности - 100x100 пикселов.

Все точки этой поверхности, находящиеся за пределами круга "лупы", окрашиваются черным:

function TfrmDD.Circle : HRESULT;

var

desc : TDDSURFACEDESC2;

i, j : Integer;

hRet : HRESULT; begin

ZeroMemory (@desc, SizeOf(desc));

desc.dwSize := SizeOf (desc);

hRet := FDDSZoom.Lock (nil, desc, DDLOCK_WAIT, 0); if Failed (hRet) then begin Result := hRet;

Exit;

end;

for i := 0 to 99 do // Цикл по всем точкам поверхности

for j := 0 to 99 do

// Выделяем точки, располагающиеся за пределами круга "лупы"

if sqr (i - 50} + sqr (j - 50) > 50 * 50 then // Заполняем черным

PWord (Integer(desc.IpSurface) + j * desc.lPitch + i * 2)^ := 0;

Result := FDDSZoom.Unlock (nil);

end;

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

// Квадрат, задающий степень увеличения

SetRect (wrkRect, mouseX + 25, mouseY + 25, mouseX + 75, mouseY + 75);

// Растягиваем участок фона

FDDSZoom.Bit (nil, FDDSBackGround, SwrkRect, DDBLT_WAIT, nil);

Circle; // Заполняем черным часть квадрата

// Выводим с цветовым ключом

FDDSBack.BltFast (mouseX, mouseY, FDDSZoom, nil,

DDBLTFAST_WAIT or DDBLTFAST_SRCCOLORKEY);

Выглядит просто и эффектно, но в решении содержится проблема: оно подходит только для черного цвета. Если в качестве ключа использовать любой другой цвет, то на точки, заполненные цветом ключа "вручную", прозрачность распространяться не будет: прозрачными окажутся только участки этого же цвета, но окрашенные вызовом метода поверхности. Разрешить означенную проблему мне не удалось, поскольку плохо понятно, как DirectDraw удается различать такие участки.

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

В проекте каталога Ех22 приведено другое решение задачи менее элегантное но - фото 19

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

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

Интервал:

Закладка:

Сделать

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

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


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

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

x