Графика DirectX в Delphi
Шрифт:
Перед блиттингом поверхности FDDS image обновляем позицию в видео:
if Sample.Update(0, 0, nil, 0) <> S_OK
then (AMStream as IMultiMediaStream).Seek (0);
Неудача свидетельствует о том, что видео прокручено до конца, в этом случае мы заново запускаем его.
Самостоятельно разберитесь, каким образом останавливается ролик при деактивизации окна приложения, и как заново запускается поток при восстановлении.
Запись в видеофайл
.Познакомившись
Вот скромный набор свойств и методов класса, необходимых нам для работы:
Bitmaps TList; // Список объектов класса Bitmap, кадры AVI
Height Integer; // Размеры кадров AVI
Width Integer;
FrameTime Integer; // Величина паузы между кадрами
Stretch BOOL; // Признак, надо ли масштабировать кадры
FileName String; // Имя файла результата
PixelFormat : TPixelFormat; // Разрядность AVI
constructor Create;
destructor Destroy; override;
procedure Write; // Запись AVI
Здесь используется модуль VFW, поэтому в опциях проекта указывается путь к файлу ole2.dcu. В проекте каталога Ех03 формируются кадры, на которых вращается спираль (рис. 6.3).
Рис. 6.3. Один из кадров нашего фильма Создается
Для записи фильма используется объект AviMakeri класса TAviMaker:
AviMakerI := TAviMaker.Create;
with AviMakeri do begin
Width := 256;
Height := 256;
Stretch := True; // Кадры будут масштабироваться
PixelFormat := pf24bit; // 24-битный формат кадра
FrameTime := 100;
FileName := 'test.avi';
end;
фильм из 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, связанной с трехмерной графикой, хотя наши первые построения будут выполняться на плоскости. Теперь большая часть изученного в предыдущих главах книги непосредственно нами использоваться не будет, но многие подходы, понятия и приемы, с которыми мы уже познакомились, перекликаются с новым материалом. Например, в наших проектах мы встретим знакомые понятия главного объекта и порождаемых его методами вспомогательных объектов, и последовательность выполняемых нами действий будет во многом родственна предыдущим примерам.