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

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

Жанры

Графика DirectX в Delphi

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

Шрифт:

function TfrmDD.UpdateFrame : HRESULT;

var

ddbltfx : TDDBLTFX; // Для очистки экрана

wrkl : Integer; // Рабочая переменная

begin

Result := DD_FALSE;

ZeroMemory (@ddbltfx, SizeOf(ddbltfx));

ddbltfx.dwSize := SizeOf(ddbltfx); ddbltfx.dwFillColor := 0;

// Закрашиваем, очищаем обе поверхности

FDDSBack.Blt(nil, nil, nil, DDBLT_COLORFILL or DDBLT_WAIT, @ddbltfx);

FDDSDouble.'Blt(nil, nil, nil, DDBLT_COLORFILL or DDBLT_WAIT, Sddbltfx);

ThisTickCount := GetTickCount;

//

Пауза для смены положения сфер

if ThisTickCount - LastTickCount > 10 then begin

Angle := Angle + 0.02;

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

end;

// Выводим три сферы на вспомогательную поверхность

FDDSDouble.BltFast (0, 140 - trunc (sin (Angle) * 100),

FDDSImageRed, nil, DDBLTFAST_WAIT);

// Красная, соответствует первому образу

FDDSDouble.BltFast (230, 140 - trunc (sin (Angle + Pi / 4) * 100),

FDDSImageGreen, nil, DDBLTFAST_WAIT);

// Зеленая, для второго образа

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

FDDSImageBlue, nil, DDBLTFAST_WAIT);

// Синяя для третьего

wrkl := Select (mouseX, mouseY); // Выбор элемента под курсором

if wrkl = -1 then begin // Произошла авария

Result := RestoreAll;

Exit;

end;

if wrkl =1 // Под курсором первая сфера, ее выводим помеченной

then FDDSBack.BltFast (0, 140 - trunc (sin (Angle) * 100),

FDDSImageSelect, nil, DDBLTFAST_WAIT)

// Под курсором не первая сфера, ее выводим обычной

else FDDSBack.BltFast (0, 140 - trunc (sin (Angle) * 100),

FDDSImageSphere, nil, DDBLTFAST_WAIT);

// Аналогично с двумя оставшимися сферами

if wrkl = 2

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

FDDSImageSelect, nil, DDBLTFAST_WAIT)

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).

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

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

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

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

function TfrmDD.Circle : HRESULT;

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

Сын Тишайшего

Яманов Александр
1. Царь Федя
Фантастика:
попаданцы
альтернативная история
фэнтези
5.20
рейтинг книги
Сын Тишайшего

"Искажающие реальность" Компиляция. Книги 1-14

Атаманов Михаил Александрович
Искажающие реальность
Фантастика:
боевая фантастика
космическая фантастика
киберпанк
рпг
5.00
рейтинг книги
Искажающие реальность Компиляция. Книги 1-14

Школа. Первый пояс

Игнатов Михаил Павлович
2. Путь
Фантастика:
фэнтези
7.67
рейтинг книги
Школа. Первый пояс

Невеста на откуп

Белецкая Наталья
2. Невеста на откуп
Фантастика:
фэнтези
5.83
рейтинг книги
Невеста на откуп

Убивать чтобы жить 2

Бор Жорж
2. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 2

Вперед в прошлое!

Ратманов Денис
1. Вперед в прошлое
Фантастика:
попаданцы
5.00
рейтинг книги
Вперед в прошлое!

Аргумент барона Бронина 4

Ковальчук Олег Валентинович
4. Аргумент барона Бронина
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Аргумент барона Бронина 4

Измена. (Не)любимая жена олигарха

Лаванда Марго
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. (Не)любимая жена олигарха

Измена. Право на обман

Арская Арина
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Право на обман

Бастард Императора. Том 7

Орлов Андрей Юрьевич
7. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 7

Жаба с кошельком

Донцова Дарья
19. Любительница частного сыска Даша Васильева
Детективы:
иронические детективы
8.26
рейтинг книги
Жаба с кошельком

Бастард Императора. Том 11

Орлов Андрей Юрьевич
11. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 11

Академия чаросвет. Тень

Ярошинская Ольга
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Академия чаросвет. Тень

Наследие Маозари 4

Панежин Евгений
4. Наследие Маозари
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Наследие Маозари 4