Вход/Регистрация
Графика DirectX в Delphi
вернуться

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

Шрифт:

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
  • ...
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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