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

Тут можно читать онлайн Михаил Краснов - Графика DirectX в Delphi - бесплатно ознакомительный отрывок. Жанр: comp-programming. Здесь Вы можете читать ознакомительный отрывок из книги онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Графика DirectX в Delphi
  • Автор:
  • Жанр:
  • Издательство:
    неизвестно
  • Год:
    неизвестен
  • ISBN:
    нет данных
  • Рейтинг:
    3.56/5. Голосов: 91
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

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

Графика DirectX в Delphi - описание и краткое содержание, автор Михаил Краснов, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

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

Графика DirectX в Delphi - читать книгу онлайн бесплатно (ознакомительный отрывок), автор Михаил Краснов
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

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 пикселов. Обратите внимание на это, при других установках рабочего стола пример работает не так эффектно.

Сразу после запуска приложения до появления на экране окна нашего приложения, копируем во вспомогательный объект класса 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),

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

Интервал:

Закладка:

Сделать


Михаил Краснов читать все книги автора по порядку

Михаил Краснов - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




Графика DirectX в Delphi отзывы


Отзывы читателей о книге Графика DirectX в Delphi, автор: Михаил Краснов. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x