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

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

Шрифт:

фильм из 20-ти кадров, продолжительностью 2 секунды:

function TfrmDD.UpdateFrame : HRESULT;

const

step = 2 * Pi / 400;

var

i : Integer;

hRet : HRESULT;

Вitmap : ТВ i tmap; DC : HOC;

begin

ThisTickCount := GetTickCount;

// В этом примере паузы можно было бы и не делать

if ThisTickCount - LastTickCount > 30 then begin

Angle := Angle + 0.25;

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

LastTickCount := GetTickCount;

// Берем 20 кадров

Inc (FrameCount);

if FrameCount > 20 then begin

FActive := False;

Result := DD_OK;

AviMakerl.Write; // Записываем AVI

Close;

Exit;

end;

// Выводим фон

hRet := FDDSBack. BltFast (0, 0, E'DDSBackGround,

nil, DDBLTFAST_WAIT);

if hRet = DDERR_SURFACELOST then begin

Result := hRet;

if Failed (RestoreAll) then Exit;

end;

// Выводим точки спирали for i := 0 to 800 do

if FDDSBack.BltFast (310 + trunc (cos(Angle -f i * step) * i / 4) ,

230 + trunc (sin(Angle + i * step) *i / 4),

FDDSImage, nil,

DDBLTFAST_WAIT) = DDERR_SURFACELOST then begin

hRet := RestoreAll;

if Failed (hRet) then begin

Result := hRet; Expend;

end;

// Формируем кадр ролика

Bitmap := TBitmap.Create;

with Bitmap do begin Width := ScreenWidth;

Height := ScreenHeight;

PixelFormat := pf24bit; // Важно, иначе устанавливается 8 бит

FDDSBack.GetDC (DC);

BitBlt(Canvas.Handle, 0, 0, // Копируем экран в растр

ScreenWidth, ScreenHeight, DC, 0, 0, SRCCOPY);

FDDSBack.ReleaseDC (DC) ;

AviMakerl.Bitmaps.Add (Bitmap); // Добавляем кадр в фильм

end;

end;

Result := DD_OK;

end;

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

Что вы узнали в этой главе

Для работы с видео имеется много способов, и, как всегда, нам пришлось выбирать из них работающие.

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

Глава 7 Обзор библиотеки Direct3D

Модуль DirectXGraphics

Тип TColor и цвет в Direct3 D

Примитивы

Точки

Режимы воспроизведения

Блоки установок

Окрашенные вершины

Отрезки

Треугольник

Полноэкранный режим

Что вы узнали в этой главе

С этой главы мы начнем переход к принципиально новой технологии программирования двумерной и трехмерной графики и рассмотрим основные понятия такого подхода.

Примеры к главе располагаются в каталоге \Examples\E\07.

Модуль DirectXGraphics

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

Начнем наш путь с простейшего примера, проекта каталога Ex01. Если DirectDraw было удобнее начинать изучать с полноэкранных приложений, то с Direct3D мы познакомимся на примерах оконных приложений. В первом проекте данной главы клиентская часть окна окрашивается синим цветом. Это минимальное приложение, использующее Direct3D. Окно непрерывно перерисовывается, а в его заголовке выводится значение FPS.

Вначале бегло посмотрим код, потом некоторые ключевые моменты обсудим подробнее.

Прежде всего, замечаем, что в списке uses модуля дописан модуль DirectXGraphics. Это базовый модуль, играющий для наших последующих примеров такую же роль, какую играл ранее модуль DirectDraw. В этом модуле содержится описание базовых интерфейсов, типов и констант.

Имя формы этого и последующих примеров я задал frmD3D.

В разделе private описания класса формы мною внесены следующие строки: FD3D IDIRECT3D8; // Главный объект

FD3DDevice IDIRECT3DDEVICE8; // Объект устройства

FActive BOOL; // Вспомогательный флаг

ThisTickCount DWORD; // Отсчет времени для подсчета FPS

LastTickCount DWORD;

function InitDSD : HRESULT; // Инициализация системы

function Render HRESULT; // Воспроизведение

procedure Cleanup; // Удаление объектов

  • Читать дальше
  • 1
  • ...
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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