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

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

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

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

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

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

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

Интервал:

Закладка:

Сделать

Сразу после запуска приложения до появления на экране окна нашего приложения, копируем во вспомогательный объект класса TBitmap содержимое рабочего стола:

wrkBitmap := TBitmap.Create; wrkBitmap.Height := 480; wrkBitmap.Width := 640;

BitBlt(wrkBitmap.Canvas.Handle, 0, 0, 640, 480, GetDC (GetDesktopWindow), 0, 0, SRCCOPY);

Поверхность фона создается "длинным" способом. При этом не загружаем ничего из растра:

ZeroMemory (ddsd, SizeOf(ddsd), 0); with ddsd do begin

dwSize := SizeOf(ddsd);

dwFlags := DDSD_CAPS or DDSD_HEIGHT or DDSD_WIDTH;

ddsCaps.dwCaps := DDSCAPS_OFFSCREENPLAIN;

dwWidth := 640;

dwHeight := 480; end;

hRet := FDD.CreateSurface(ddsd, FDDSBackGround, nil);

if Failed(hRet) then ErrorOut(hRet, 'Create Back Surface');

// Копируем содержимое wrkBitmap на фоновую поверхность

hRet := DDCopyBitmap (FDDSBackGround, wrkBitmap.Handle, 0, 0,

wrkBitmap.Width, wrkBitmap.Height);

if Failed(hRet) then ErrorOut(hRet, 'DDCopyBitmap'); wrkBitmap.Free; // wrkBitmap больше не требуется

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

function TfrmDD.Rotate (const pictOriginal : TWordArray) : TWordArray;

var

i, j, k : Integer;

begin

ZeroMemory (SResult, SizeOf (Result)); for j := 0 to 255 do

for i := 0 to 255 do begin

k := trunc (sin (Angle + j * 3 * Pi / 255) * 10); // Сдвиг точек

if (i - k >= 0) and (i - k <= 255) then // Помещается ли в растр

Result [i, j] := pictOriginal [i - k, j ] ;

end;

Angle := Angle +0.2; // Периодичный сдвиг

if Angle > 2 * Pi then Angle := Angle - 2 * Pi;// Избежать переполнения

end;

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

Выбор объектов

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

В таких случаях используется выбор по цвету, заключающийся в том, что объекты раскрашиваются в различные цвета, анализ цвета нужной точки дает ответ на вопрос: "Что в настоящий момент находится под курсором".

Рассмотрим пример из проекта каталога Ех20. На экране перемещаются три одинаковых образа, при этом образ, находящийся под курсором, перекрашивается (рис. 3.9).

Поскольку образы выводятся совершенно одинаковые мы не можем напрямую - фото 17

Поскольку образы выводятся совершенно одинаковые, мы не можем напрямую различать их по цвету. Действуем так: на вспомогательной поверхности DDSDoubie отображаем образы такой же формы, что и на экране, но разные по цвету (в моем примере это три круга чистых цветов: красного, зеленого i синего). Выводятся они с теми же координатами, что и на экране. Перед тем, как отобразить сферы на экране, анализируем цвет нужного пиксела на вспомогательной поверхности:

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)

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

Интервал:

Закладка:

Сделать

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

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


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

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

x