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

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

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

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

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

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

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

Интервал:

Закладка:

Сделать

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

В проекте каталога ExOl на знакомом нам фоне воспроизводится AVl-файл, взятый мною из набора файлов, поставляемых в составе DirectX SDK (рис. 6.1).

В списке подключаемых модулей добавлен модуль VFW а в установках проекта - фото 43

В списке подключаемых модулей добавлен модуль VFW, а в установках проекта - путь к файлу ole2.dcu, в котором нуждается подключаемый модуль.

Следующие переменные связаны со спецификой примера:

var

TmpBmp : TBitmap; // Вспомогательное изображение

AviStream : PAVISTREAM; // AVI-поток

Frame : PGetFrame; // кадр видео

pbmi : PBITMAPINFOHEADER; // Указатель на заголовок растра

bits : Pointer; // Указатель на картинку растра

CurrFrame DWORD - 0; // Счетчик кадров

AVIClock DWORD; // Эмулятор таймера

AVIDelay DWORD; // Величина паузы между кадрами

AVIWidth DWORD; // Характеристики кадра

AVIHeight DWORD;

AVILength DWORD; // Количество кадров в AVI

Перед инициализацией DirectDraw нам необходимо узнать характеристики отображаемого видео, для этого используем функции рассматриваемого модуля, связанные с работой AVI как с файлом:

var

AVIFile : PAVIFile; // Обрабатываем AVI как файл

AVIlnfo : TAVIFilelnfo; // Заголовок файла, характеристики AVI

begin

TmpBmp := TBitmap.Create; // Создаем вспомогательный растр

AVIFileOpen(AVIFile, AVIName, OF_READ, nil); // Открытие AVI

// Считываем заголовочную информацию, заполняются поля AVIlnfo

AVIFilelnfo(AVIFile, AVIlnfo, SizeOf (AVIlnfo));

AVIWidth := AVIInfo.dwWidth; // Запоминаем размеры кадра

AVIHeight := AVIlnfo.dwHeight;

AVILength := AVIlnfo.dwLength; // Количество кадров

// Вычисляем паузу между очередными кадрами

AVIDelay := 1000 div (AVIInfo.dwRate div AVIInfo.dwScale);

AVIFileRelease(AVIFile); // Освобождаем AVI

Поверхность FDDSImage, на которой будет воспроизводиться видео, создается с размерами, равными размерам кадра видео:

ZeroMemory (@ddsd, SizeOf(ddsd));

with ddsd do begin

dwSize := SizeOf(ddsd);

dwFlags := DDSD_CAPS or DDSD_HEIGHT or DDSD_WIDTH;

ddsCaps.dwCaps := DDSCAPS_OFFSCREENPLAIN;

dwWidth := AviWidth;

dwHeight := AVIHeight;

end;

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

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

В общем случае заводить отдельную поверхность для воспроизведения кадра, конечно, не обязательно, можно переносить содержимое вспомогательного растра прямо на первичную поверхность.

После инициализации DirectDraw подготавливаемся к работе с потоковым видео:

procedure TfrmDD.FirstFrame;

var

wrkDC : HDC;

begin

AVIFilelnit; // Инициализация библиотеки

// Открываем AVI-файл для чтения

AVIStreamOpenFromFile(AviStream, AviName, streamtypeVIDEO,

0, OF_READ, nil);

// Загружаем поток

Frame := AVIStreamGetFrameOpen(AviStream, nil);

// Получаем первый кадр видео

pbmi := AVIStreamGetFrame(Frame, CurrFrame);

// Получаем указатель на картинку кадра

bits := Pointer(Integer(pbmi) + SizeOf(TBITMAPINFOHEADER));

// Получаем контекст для воспроизведения кадра на поверхность

if FDDSImage.GetDC (wrkDC) = DD_OK then begin

// Воспроизводим кадр во вспомогательный растр

TmpBmp.Handle := CreateDIBitmap(

// Вспомогательным контекстом служит HDC поверхности

wrkDC,

pbmi^, // Адрес размера растра и формата данных

CBM_INIT, // Флаг инициализации

bits, // Данные для инициализации

PBITMAPINFO(pbmi)^, // Данные о формате цвета

DIB RGB_COLORS); // Флаг цветности растра

// Переносим картинку из вспомогательного растра на поверхность

BitBlt (wrkDC, О, О, AVIWidth, AVIHeight,

TinpBmp. Canvas .Handle, 0, 0, SRCCOPY);

FDDSImage.ReleaseDC (wrkDC);

end;

AVIClock := GetTickCount; // Инициализация вспомогательного таймера

end;

Действия по воспроизведению очередного кадра аналогичны, но тратить время на получение адресов теперь не нужно:

procedure ТfrmDD,NextFrame;

var

wrkDC : HDC;

begin

// Настало время воспроизвести следующий кадр AVI

if GetTickCount - AVIClock > AVIDelay then begin

pbmi := AVIStreamGetFrame(Frame, CurrFrame);

if FDDSImage.GetDC (wrkDC) = DD_OK then begin

TmpBmp.Handle := CreateDIBitmap(wrkDC, pbmi^, CBM_INIT,

bits, PBITMAPINFO(pbmi) Л, DIB_RGB__COLORS) ;

BitBlt (wrkDC, 0, 0, AVIWidth, AVIHeight,

TmpBmp.Canvas.Handle, 0, 0, SRCCOPY);

FDDSImage.ReleaseDC (wrkDC);

end;

// Увеличиваем счетчик кадров

CurrFrame := (CurrFrame + 1) mod AVILength;

AVIClock := GetTickCount;

end;

end;

В этом примере AVI-файл воспроизводится бесконечно, вслед за последним кадром все повторяется с начала.

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

По завершении работы добавились ожидаемые действия:

AVIStreamRelease(AviStream); // Закрытие потока

AVIFileExit; // Завершение работы с библиотекой

TmpBmp.Free; // Удаление вспомогательного растра

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

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

Интервал:

Закладка:

Сделать

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

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


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

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

x