Зацикливание воспроизведения звуков

Кажется чего-то не хватает... Хм, что же это может быть? Конечно же IMediaEvent, третий дополнительный интерфейс, который вы получили из объекта IgraphBuilder. Интерфейс IMediaEvent становится действительно полезным, если вам необходимо узнать, закончилось ли воспроизведение звука. (Это все, что нас заботит на данный момент.) Он полезен, если вы хотите определить, должен ли звук начаться сначала или должно ли произойти другое событие при окончании проигрывании звука.

События представлены командным кодом и двумя параметрами, приведенными к типу данных long.

long Code, Param1, Param2;

Для получения кода события и параметров вы можете вызвать IMedia-Event::GetEvent, как показано тут:

HRESULT hr = pEvent->GetEvent(&Code, &Param1, &Param2, 1);

Запись значения, возвращаемого IMediaEvent::GetEvent, является очень важным. Значение S_OK соответствует корректному получению события, а любое другое значение ошибки означает, что больше нет обрабатываемых событий. Т. к. обработки может ожидать любое количество событий, вам необходимо непрерывно вызывать GetEvent, пока все события не закончатся. Вы можете увидеть этот процесс здесь, содержащийся в цикле while.

Замечание. Четвертым параметром функции IMediaEvent::GetEventявляется количество миллисекунд, которые необходимо подождать перед получением события. Я всегда жду одну миллисекунду прежде чем продолжить.

while(SUCCESS(pEvent->GetEvent(&Code,&Param1,&Param2,1))) { // Обработать событие завершения проигрывания if(Code== EC_COMPLETE) { // Сделать что-нибудь по завершению проигрывания

}

// Освободить данные события

pEvent->FreeEventParams(Code, Param1, Param2) ;

}

Из комментариев к предыдущему коду вы можете увидеть, что я проверяю тип кода события, полученного вызовом GetEvent. Единственным интересующим нас событием является завершение проигрывания, которое представлено макросом ECCOMPLETE. Внутри блока условия вы можете делать все, что пожелаете. Например, вы можете переместиться в начало звука и начать проигрывать его, как я сделал тут:

// Обработать событие завершения проигрывания if(Code == EC_COMPLETE) {

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

pPosition->put_CurrentPosition(0.0f);

pControl->Run() ;

}

Вы также могли заметить вызов функции IMediaEvent::FreeEventParams. Вы должны всегда вызывать IMediaEvent::FreeEventParams, чтобы позволить DirectSound освободить все ресурсы, которые были выделены для получения событий при вызове функции GetEvent.

Реализовав это, функция проигрывания звука завершена! Ну, почти завершена. После завершения работы со звуком, вы можете вызвать IMediaControl::Stop для остановки проигрывания всех звуков и освободить все интерфейсы СОМ при помощи функции Release.

Посмотрите демонстрационные программы

Гмм! Лицевую анимацию невероятно просто использовать, если вы знаете как, а эффект от ее использования просто потрясающ. На компакт-диске книги вы обнаружите две программы, связанные с лицевой анимацией - FacialAnim и ConvLWV.

Первая программа, FacialAnim, является обычным проектом, поставляемым с исходным кодом. Демонстрационная программа FacialAnim, показанная на рис. 11.14, иллюстрирует мощь движка лицевой анимации, разработанного в этой главе.

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

Зацикливание воспроизведения звуков

Рис. 11.14. Прослушайте футбольный репортаж игрового персонажа, с полностью синхронизированными губами, в демонстрационной программе FacialAnim!

После того как вы полностью завершите систему лицевой анимации, я предлагаю вам улучшить технологии, рассмотренные здесь, добавив персонажу новые детали, такие как зубы, волосы и брови. Добавьте анимацию глазам меша или увеличьте набор фонем. После того как вы закончите лицевые меши, поиграйте с текстурами. Текстуры являются очень важными в системе, потому что тек-стурированная модель всегда выглядит лучше обычной.

Программы на компакт-диске

Директория главы 11 компакт-диска включает проект (демонстрационную программу) FacialAnim и две программы (программный пакет Agent фирмы Microsoft и программу ConvLWV). В директорию входят:

• FacialAnim. Посмотрите на пример лицевой анимации, приведенный в этой демонстрационной программе, содержащей говорящий меш, меняющий свое поведение во времени. Она расположена в \BookCode\Chap11\FacialAnim.

• Agent. Программный пакет Agent фирмы Microsoft включает в себя Linguistic Information Sound Editing Tool. Он расположен в \BookCode\Chap11\Agent.

• ConvLWV. Эта программа преобразует файлы .LWV в .X и сохраняет последовательность фонем в объектах, легко импортируемых игровым проектом. По причинам лицензирования исходный код для этого проекта недоступен. Программа расположена в \BookCode\Chap11\ConvLWV.

Часть V

Прочие типы анимации

12. Использование частиц в анимации

13. Имитирование одежды и анимация мешей мягких тел

14. Использование анимированных текстур

Глава 12

Использование частицв анимации

Яркий взрыв, клочья травы, валящиеся деревья, клубы дыма, кричащие пешеходы - что они могут иметь общего? Факт того, что вы можете нарисовать все это, используя частицы, вот что! Частицы являются основным специальным эффектом игр, позволяя отображать множество вещей, начиная от капель дождя и заканчивая сверкающими взрывами разлетевшейся шрапнели. Применяя небольшие ноу-хау и помощь этой главы, вы можете использовать эти простые маленькие частицы для существенного улучшения внешнего вида игры!

В этой главе вы научитесь:

Рисовать частицы, используя три различные технологии;

• Передвигать частицы с использованием скорости;

• Создавать классы, управляющие частицами, в вашей игре.

Синхронизация анимации со звуком || Оглавление || Работа с частицами