Графика для Windows средствами DirectDraw
Шрифт:
После блокировки поверхности функция UpdateAviSurface
Все трудное осталось позади, дальше будет легко. Особенно просто реализуется функция RestoreSurfaces:
Вспомните — функция RestoreSurfaces вызывается только при восстановлении потерянных поверхностей, а класс DirectDrawWin автоматически восстанавливает первичную поверхность со вторичным буфером. В программе AviPlay остается лишь восстановить поверхность AVI, а для этого достаточно вызвать функцию Restore интерфейса DirectDrawSurface.
В некоторых программах функция RestoreSurfaces восстанавливала не только область памяти, но и содержимое поверхности. В нашем случае можно ограничиться восстановлением памяти, потому что ее содержимое будет перезаписано следующим кадром. Если вы вдруг засомневаетесь, напомню — вызов функции Restore для поверхности, которая не была потеряна (например, находящейся в системной памяти), не причинит никакого вреда.
В программе AviPlay ввод не играет особой роли. Программа реагирует всего на три клавиши, причем одинаково. Ввод с клавиатуры обрабатывается функцией OnKeyDown:
Все три клавиши вызывают функцию ShowDialog. Аналогично обрабатывается и ввод от мыши, это происходит в функции OnRButtonDown:
Когда пользователь закрывает диалоговое окно для выбора AVI-файла,
Остается лишь завершить приложение. Функция OnDestroy занимается «уборкой мусора» — она закрывает открытые AVI-потоки, освобождает декомпрессор и буферы данных AVI:
Обратите внимание на вызов функции AviFileExit в конце OnDestroy. Это завершает работу VFW и освобождает все используемые им ресурсы.
Наше знакомство с воспроизведением видеороликов подходит к концу. Честно говоря, чтобы превратить программу AviPlay в полноценный проигрыватель AVI-файлов, вам придется еще немало потрудиться. Необходимо организовать поддержку звука и хронометраж, не говоря уже о том, что VFW обладает многими странностями и в работе с ним приходится много экспериментировать.
И последнее замечание. По неизвестным мне причинам VFW отказывается работать с AVI-файлами, сжатыми кодеками IR32 и IR42 (возможно, есть и другие, но я заметил эти два). С другой стороны, AVI-файлы, использующие кодеки MS-CRAM и Cinepak, работают нормально.
В главе 9 мы возьмемся за проверку столкновений. Наша цель — написать код, который бы обеспечивал точность проверки на уровне пикселей при максимальной эффективности.
Глава 9. Проверка столкновений
Спрайты, переключение страниц, палитры, поверхности — это просто замечательно, и в предыдущих главах мы узнали немало полезного. Но поместить спрайты на экран и передвигать их туда-сюда — это еще не все. В большинстве приложений изображения, геометрические фигуры и символы на экране должны взаимодействовать с пользователем и друг с другом. В главе 6 при изучении DirectInput было описано взаимодействие спрайтов с пользователем. В этой главе мы узнаем, как спрайты взаимодействуют друг с другом.