Автор: Jack Hackslay
DS довольно прост для обучения, возможно, это самая легкая часть DirectX. Если вы не планируете создание трехмерной игры, DirectSound3D не должен вас волновать. Для полного восприятия режима 3D пользователю будет необходима 3D звуковая система (обычно система из четырех динамиков).
Прим. перев.: Для тех, кто занимается созданием трехмерных игрушек, раздел "3D режим" выйдет чуть позже и в отдельном учебнике, т.к. в оригинале он почти не освещен.
DirectSound, как можно понять из названия, проигрывает звуки. Обычно он используется для создания звуковых эффектов в играх, благодаря своей способности проигрывать больше, чем один звук в одно и то же время ("Микширование"). Также, вы можете более точно контролировать звучание в динамиках пользователя используя эффекты громкости и баланса звука(panning). Также, есть возможность задания координат x, y и z для источника звука, но в полной мере эта опция, называемая DirectSound3D работает на компьютерах, оснащенных звуковой системой из 4-х динамиков. Лучше всего 3D звук используется в шутерах от первого лица, где игрок может слышать звуки изо всех направлений.
DirectSound очень важен для игр. Многие обозреватели трехмерных игр забывают о звуке. Попробуйте играть в игру с выключенным звуком и вы поймете разницу.
К сожалению, многие компоненты DirectX, ограничены в Visual Basic. И поэтому имеется очень маленькая поддержка действительно 3D позиционированного звука. Причина этого в самом языке, ведь Visual Basic в основе своей инструмент для баз данных (поэтому в нем так много инструментов для управления данными), и язык никогда не планировался для разработки игр. Профессиональные компании используют C++ для создания игр, поэтому DirectX имеет больше поддержки в C++, чем в Visual Basic.
Этот учебник покажет вам как создать
простое приложение, которое проигрывает несколько звуков в одно и то же время. У
него будут опции для баланса звука (Право <-> Лево) и громкости (ну это вы
знаете!).
Код из этого приложения затем может быть добавлен в любую вашу
игру, где будут использоваться звуковые эффекты.
Сначала, несколько понятий:
Буфер - место, в
котором содержатся звуковые данные
Wav файл
- тип файлов,
которые использует DSound: *.wav
Щелкните в списке, чтобы перейти к нужной секции:
СЕКЦИЯ |
СОДЕРЖАНИЕ |
Создание проекта для работы с Direct Sound | |
Переменные и их объяснения | |
Как должна выглядеть форма, и код, которые все соединит | |
Заставим программу загрузить звуковые данные | |
Ну этим все сказано! Получим полезный результат от программы. | |
Добавим эффекты |
Финальный аккорд |
Готовый проект с примером |
Этот проект использует DirectX 7, поэтому добавьте соответствующую библиотеку к вашему проекту.
Также, вам потребуется несколько звуковых файлов для проигрывания. Найдите пару wav файлов (попробуйте через пункт "Поик" из меню "пуск". Скпируйте два РАЗНЫХ файла в папку с вашим проектом, переименовав их в Tester1.wav и Tester2.wav
Сохраните проект и переходите к следующей секции...
В этом проекте будет довольно мало переменных, но все же надо по ним пробежаться. Добавьте эти строки в секцию Declarations для Form1:
Option
Explicit 'Очень
полезное требование, когда работаете с DirectX |
Позже, каждый буфер будет вызываться, чтобы проигрывать/остановить его содержимое.
Интерфейс, как вы можете видеть, довольно мудреный. Интерфейс содержит набор элементов, управляющих каждым буфером и набор общих элементов управления. Вот таблица свойств элементов:
(1) Сначала, создайте два фрейма с
любыми именами. Свойство Caption одного должно быть
"Громкость", а другого "Баланс" |
Теперь, у вас должен быть интерфейс.
Затем, нам надо создать код, который будет все это связывать воедино. Это короткие отрезки кода для каждого элемента управления, которые будут задавать работу этих элементов управления. Помните, не запускайте проект после того как напишете эти строки, вы получите кучу сообщений об ошибках (Мы ведь не написали еще весь код!). Код для скролл баров будет показан позже, так как для него требуется более тщательный разбор...
Если вы присваивали элементам управления такие же имена, как у меня, можете просто копировать эти строки в вашу программу.
Private Sub Form_Load()
')))))))))))))))))))))(КОД ЦИКЛА
ПРОИГРЫВАНИЯ)(((((((((((((((((((((((((((((((((((((((((((((
'Проверка буфера - это ловушка для
ошибки. Вы не можете изменять состояние буфера, когда Private
Sub chBoth_Loop_Click() Private Sub
chTester1_Loop_Click() Private Sub
chTester2_Loop_Click() '))))))))))))))))))))))))))(КОНЕЦ ЦИКЛА ПРОИГРЫВАНИЯ)(((((((((((((((((((((((((((( ')))))))))))))))))))))))))))))))(КОД
ПАУЗЫ)((((((((((((((((((((((((( Private
Sub cmdBoth_Pause_Click() Private Sub
cmdTester1_Pause_Click() Private Sub
cmdTester2_Pause_Click() ')))))))))))))))))))))))))))))))(КОД
ОСТАНОВКИ)(((((((((((((((((((((( 'Эти процедуры останавливают звук и "перематывают" его на начало. Private
Sub cmdBoth_Stop_Click() Private Sub
cmdTester1_Stop_Click() Private Sub
cmdTester2_Stop_Click() '))))))))))))))))))))))))))))))))))))))))))))))))))(КОНЕЦ КОДА ОСТАНОВКИ)(((((((((((((((((((((((((((((( |
Это первая ступень в создании кода. Помните, что пока нельзя запускать проект, вы получите сообщение об ошибке
Создание загрузочной процедуры
Слудующей ступенью создания программы будет написание процедуры, загружающей звук в буфер. Назовем ее "LoadWave". Помните, мы ее еще упоминали в процедуре Form_Load? Вот код:
Sub LoadWave() Dim bufferDesc
As DSBUFFERDESC 'этот новый объект
передается DS, чтобы описать, какой буфер создается waveFormat.nFormatTag =
WAVE_FORMAT_PCM 'Проверяет "свойства" паннинга
и громкости |
Примечание: если вы получите сообщение об ошибке, но вы знаете, что файлы находятся на своих местах, возможно то, что они записаны в неправильном формате. Вы не можете заметить разницу, пока не загрузите их, но некоторые wav файлы записаны в формате PCM (то, что требует DirectSound), а некоторые нет. Если это произойдет, выберите другие файлы.
Наконец-то мы
получим полезные свойства от нашей программы...
Следующий код можете
скопировать в поцедуры
cmdBoth_Play
cmdTester1_Play
cmdTester2_Play
Private Sub
cmdBoth_Play_Click() 'Следующие две процедуры почти
идентичны Private Sub
cmdTester2_Play_Click() |
OK, теперь у нас есть хоть что-то полезное. Следующий раздел будет еще интересней.
Добавление эффектов громкости и паннинга
Использование громкости очень просто, а паннинг вам обязательно пригодится. Если вы делаете "приставочную" игру, вы можете использовать эту функцию, чтобы звук исходил справа или слева от игрока, добавляя новое измерение в окружение. Это также очень просто.
Вы уже должны были нарисовать ScrollBar'ы и установить их свойства, так что просто скопируйте этот код в ваш проект.
Private Sub
scrlTester1_Pan_Change() Private Sub
scrlTester1_Vol_Change() Private Sub
scrlTester2_Pan_Change() Private Sub
scrlTester2_Vol_Change() |
Все ужасно просто. Но вы наверное хотите узнать максимальные/минимальные установки громкости и паннинга:
Громкость колеблется от -5000 (тишина) до 0 (самая громкая). Это всего лишь "проценты " от громкости, установленной в Панели Управления Windows. Если громкость там установлена очень тихой, то любые изощрения не приведут к более громкому результату.
Паннинг принимает значения от -10 000 (Левое ухо) до 0 (Все ухи :-) и до 10 000 (Правое ухо)
Ну вот и все!
Обзор сделанного
OK, чего это мы тут натворили?
Мы сделали программу, которая помещает Wav
файлы в память и проигрывает их с установленными значениями громкости и баланса
звука (паннинг).
На что надо обратить внимание:
Хранение звуков занимает RAM, так что разумные пределы 5-6 маленьких звуков. Если вы занрузите 10 или больше больших звуков в память, быстродействие оставит желать лучшего. В моих планах размещение учебника, в котором показано как проигрывать файл по мере загружения (streaming) вместо хранения его в памяти (как только так сразу - переведем! :) Прим. перев.)
А самые любопытные могут загрузить готовую программу прямо сейчас. Размер 100кб.
Have fun.
Перевод на русский язык (c)2000
Antiloop
Публикуется с
разрешения автора.
Полное или частичное цитирование перевода
только с
разрешения переводчика. Пишите!