Михаил Краснов - Графика 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 - читать книгу онлайн бесплатно (ознакомительный отрывок), автор Михаил Краснов
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

hRet := AMStream.Initialize(STREAMTYPE_READ, 0, nil);

if Failed (hRet) then ErrorOut (hRet, 'Stream Initialize');

// Добавление потока видео к главному объекту

hRet := AMStream.AddMediaStream(FDD, MSPID_PrimaryVideo,

0, IMediaStream(ni!A));

if Failed (hRet) then ErrorOut (hRet, 'Add Video Stream');

// Открытие файла

hRet := AMStream.OpenFile(PWideChar(FileName) , 0);

if Failed (hRet) then ErrorOut (hRet, 'Open AVI File');

// Следующие действия предназначены для связывания потока и поверхности

// Получение дочернего потока

hRet := (AMStream as IMultiMediaStream).

GetMediaStream(MSPID_PrimaryVideo, PrimaryVidStream);

if Failed (hRet) then ErrorOut (hRet, 'GetMediaStream');

// Преобразование интерфейса в тип Isample

//и связывание его с поверхностью

hRet := (PrimaryVidStream as IDirectDrawMediaStream).

CreateSample (FDDS Image, TRect(nil/4), 0, Sample);

if Failed (hRet) then ErrorOut (hRet, 'CreateSample');

// Запуск потока

hRet := (AMStream as IMultiMediaStream).SetState(STREAMSTATE_RUN);

if Failed (hRet) then ErrorOut (hRet, 'SetState');

end;

Обработку возможных ошибок я оставил прежней, но коды ошибок не будут расшифровываться. Модуль DirectDraw не содержит, конечно, пояснения по этим ошибкам.

Перед блиттингом поверхности FDDS image обновляем позицию в видео:

if Sample.Update(0, 0, nil, 0) <> S_OK

then (AMStream as IMultiMediaStream).Seek (0);

Неудача свидетельствует о том, что видео прокручено до конца, в этом случае мы заново запускаем его.

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

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

.Познакомившись с различными способами воспроизведения видеоданных, мы научимся создавать AVI-файлы. Пройдет этот процесс для вас очень легко, поскольку воспользуемся мы готовым модулем AviMaker. Он содержит описание класса TAviMaker, выполняющего за нас всю изнурительную работу. Нам остается только подготовить набор растров, составляющих последовательность кадров создаваемого фильма, и вызвать метод записи.

Вот скромный набор свойств и методов класса, необходимых нам для работы:

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).

Рис 63 Один из кадров нашего фильма Создается Для записи фильма используется - фото 45

Рис. 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, связанной с трехмерной графикой, хотя наши первые построения будут выполняться на плоскости. Теперь большая часть изученного в предыдущих главах книги непосредственно нами использоваться не будет, но многие подходы, понятия и приемы, с которыми мы уже познакомились, перекликаются с новым материалом. Например, в наших проектах мы встретим знакомые понятия главного объекта и порождаемых его методами вспомогательных объектов, и последовательность выполняемых нами действий будет во многом родственна предыдущим примерам.

Начнем наш путь с простейшего примера, проекта каталога 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; // Удаление объектов

procedure ErrorOut (const Caption : PChar; const hError : HRESULT);

Сообщение об ошибке выводится пока в отдельном окне, для оконных приложений здесь не должно возникать проблем:

procedure TfrmDSD.ErrorOut (const Caption : PChar;

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

Интервал:

Закладка:

Сделать


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

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




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


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


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

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