Чтение онлайн

на главную - закладки

Жанры

Графика DirectX в Delphi

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

Шрифт:

Delay := 0;

end;

В данном разделе мы рассмотрели лишь основные функции библиотеки CDX, все остальные остаются вам для самостоятельного изучения.

Я не думаю, что здесь вы встретите особые проблемы, т. к. после проведенного нами детального изучения механизмов DirectDraw знакомство с подобными библиотеками (и исправление ошибок в исходном коде) превращается в приятное времяпрепровождение.

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

Главное, что мы смогли выяснить в данной главе, можно

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

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

Спрайтовая анимация изучена нами до уровня, нужного для разработки игр.

Примеры несложных игр убедительно демонстрируют достигнутые нами высоты мастерства.

Мы познакомились с готовой библиотекой, использующейся профессиональными разработчиками игр.

Глава 6 Работа с AVI-файлами

Модуль VFW

Модуль DirectShow

Запись в видеофайл

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

Эта небольшая глава посвящена вопросам, относящимся к воспроизведению и созданию видео. Многие аспекты напрямую не связаны с DirectX и поэтому вынесены в отдельную часть.

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

Модуль VFW

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

Прежде всего мы познакомимся с модулем vfw.pas, не входящим в набор стандартных модулей Delphi, но работающим со стандартной системной библиотекой avifil32.dll.

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

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

В списке подключаемых модулей добавлен модуль 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);

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

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

Свадьба по приказу, или Моя непокорная княжна

Чернованова Валерия Михайловна
Любовные романы:
любовно-фантастические романы
5.57
рейтинг книги
Свадьба по приказу, или Моя непокорная княжна

Сборник коротких эротических рассказов

Коллектив авторов
Любовные романы:
эро литература
love action
7.25
рейтинг книги
Сборник коротких эротических рассказов

Отец моего жениха

Салах Алайна
Любовные романы:
современные любовные романы
7.79
рейтинг книги
Отец моего жениха

Вадбольский

Никитин Юрий Александрович
1. Вадбольский
Фантастика:
попаданцы
5.00
рейтинг книги
Вадбольский

Бастард Императора. Том 7

Орлов Андрей Юрьевич
7. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 7

Повелитель механического легиона. Том VIII

Лисицин Евгений
8. Повелитель механического легиона
Фантастика:
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Повелитель механического легиона. Том VIII

В зоне особого внимания

Иванов Дмитрий
12. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
В зоне особого внимания

Таня Гроттер и магический контрабас

Емец Дмитрий Александрович
1. Таня Гроттер
Фантастика:
фэнтези
8.52
рейтинг книги
Таня Гроттер и магический контрабас

Бастард Императора. Том 2

Орлов Андрей Юрьевич
2. Бастард Императора
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Бастард Императора. Том 2

Кодекс Крови. Книга ХI

Борзых М.
11. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Крови. Книга ХI

Третий

INDIGO
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий

Возвышение Меркурия. Книга 16

Кронос Александр
16. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 16

Идеальный мир для Лекаря 9

Сапфир Олег
9. Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
6.00
рейтинг книги
Идеальный мир для Лекаря 9

Потусторонний. Книга 1

Погуляй Юрий Александрович
1. Господин Артемьев
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Потусторонний. Книга 1