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

Вы можете найти этот класс, названный cAnimationTexture, на компакт-диске, в директории \BookCode\Chap14\TextureAnim\. Объявление класса выглядит так:

class cAnimatedTexture {

protected:

IGraphBuilder *m_pGraph; // граф фильтра

IMediaControl *m_pMediaControl; // Управление проигрыванием IMediaPosition *m_pMediaPosition; // Управление положением IMediaEvent *m_pMediaEvent; // Управление событиями IDirect3DDevice9 *m_pD3DDevice; // 3D устройство IDirect3DTexture9 *m_pTexture; // Объект текстуры

public: cAnimatedTexture(); ~cAnimatedTexture();

// Загрузить и освободить объект анимированной текстуры BOOL Load(IDirect3DDevice9 *pDevice, char *Filename); BOOL Free() ;

// Обновить текстуру и проверить цикл BOOL Update() ;

// Вызывается в конце анимации virtual BOOL EndOfAnimation();

// Функции проиграть и остановить BOOL Play(); BOOL Stop() ;

/ / Начать анимацию заново или перейти к заданному времени

BOOL Restart( ) ;

BOOL GotoTime(REFTIME Time) ;

// Вернуть указатель на объект текстуры IDirect3DTexture9 *GetTexture() ;

};

Большая часть членов класса cAnimatedTexture должна быть вам знакома. В нем содержаться обычные интерфейсы DirectShow, используемые для воспроизведения событий и информации о положении, пара объектов Direct3D, применяемые для указания на используемое 3D устройство, и объект поверхности текстуры, указывающий на поверхность текстуры фильтра.

Наряду с переменными, в классе определено 11 функций. Среди которых - конструктор и деструктор класса, которые инициализирует его переменные и освобождают используемые ресурсы соответственно. Далее идет функция Load, которая загружает видео файл и подготавливает к использованию фильтр. Для загрузки файла функции Load необходимо предоставить только указатель на используемый объект IDirect3DDevice9 и имя загружаемого видео файла, используемого в качестве текстуры! Функция Load создаст экземпляр класса cTextureFilter и будет использовать его для загрузки данных видео. После завершения работы с объектом класса cAnimated-Texture вызовите функцию Free для освобождения всех используемых им ресурсов и интерфейсов.

Далее следует функция Update, которая должна вызываться при каждой итерации вашего цикла сообщений (каждый кадр игры). Функция Update опрашивает объект события медиа, есть ли в нем какие-либо события; если есть, то они обрабатываются. Если воспроизведение видео было окончено, тогда вызывается функция EndOfAnimation.

Вы заметите, что функцию EndOfAnimation можно перегружать, что позволяет вам создавать собственные функции, определяющие, что необходимо сделать по окончании воспроизведения видео. Например, вы можете вызвать функцию Restart, которая запускает воспроизведение заново с самого начала, или можете вызвать Goto-Time, которая принимает в качестве параметра значение REFTIME (вещественное значение), означающее смещение воспроизведения от начала.

Наконец, есть еще три функции. Start начинает воспроизведение видео с текущего положения, a Stop останавливает воспроизведение. Существует возможность приостановить воспроизведение, вызвав Stop, а потом продолжить его, вызвав Play.

И, наконец, функция GetTexture, которая аналогична функции фильтра GetTexture; обе возвращают указатель на интерфейс объекта текстуры, который позволяет вам установить текстуру с помощью вызова IDirect3DDevice9::SetTexture.

Я не собираюсь приводить код класса cAnimatedTexture, т. к. большую его часть вы уже видели в этой главе. Опять же, я рекомендую вам посмотреть исходный код проекта TextureAnim на компакт-диске книги. Чтобы увидеть функциональность класса cAnimatedTexture, давайте рассмотрим небольшой пример работы с ани-мированными текстурами.

Работа со специализированным фильтром || Оглавление || Применение анимированных медиа текстур