netlib.narod.ru | < Назад | Оглавление | Далее > |
Я полагаю, что многие из вас раньше работали с DirectSound, и когда вы будете писать свою первую игру в XNA, то заметите, что относящиеся к звуку пространства имен весьма отличаются от DirectSound из DirectX. Давайте взглянем, как DirectSound использовался в DirectX для управляемого кода. Сперва вам надо инициализировать устройство DirectSound:
soundDevice = new DirectSound.Device(); soundDevice.SetCooperativeLevel(form, CooperativeLevel.Priority);
Теперь можно загружать все звуки, но это достаточно сложное действие, поскольку требуется несколько звуковых буферов и надо перехватывать ситуацию отсутствия файла, когда DirectSound может генерировать исключение InvalidOperationException, без дополнительных сообщений об ошибке. Вот код из игры Rocket Commander в версии DirectX для управляемого кода, проверяющий, что все звуковые файлы существуют и обеспечивающий возможность многократного воспроизведения звуков:
if (File.Exists(Directories.SoundsDirectory + "\\" + filename) == false) { Log.Write("Sample " + filename + " was not found!"); loaded = false; return; } // if (File.Exists) BufferDescription bufferDesc = new BufferDescription(); bufferDesc.StaticBuffer = true; bufferDesc.ControlPan = true; bufferDesc.ControlVolume = true; bufferDesc.ControlFrequency = true; buffer = new SecondaryBuffer[setNumberOfSimultaneousSounds]; channelVolume = new float[setNumberOfSimultaneousSounds]; channelPanning = new float[setNumberOfSimultaneousSounds]; buffer[0] = new SecondaryBuffer( Directories.SoundsDirectory + "\\" + filename, bufferDesc, Sound.Device); defaultFrequency = buffer[0].Frequency; for (int i = 1; i < buffer.Length; i++) buffer[i] = buffer[0]; try { for (int i = 1; i < buffer.Length; i++) buffer[i] = buffer[0].Clone(Sound.Device); } // try catch { } // catch
И, наконец, следующий код требуется для воспроизведения звуковых эффектов. Помимо этого вы можете устанавливать громкость и панорамирование каждого канала звукового буфера, благодаря коду в конструкторе класса Sample (ControlPan, ControlVolume, ControlFrequency и т.д.). Дополнительный код для управления всеми звуковыми буферами и свойствами каждого звука (громкостью, панорамированием, частотой) здесь не показан, поскольку он составляет большую часть кода класса Sample игры Rocket Commander. Посмотрите сами, если вам интересно.
// Обеспечиваем запуск с позиции 0 buffer[currentBufferNum].SetCurrentPosition(0); // И воспроизводим звук buffer[currentBufferNum].Play(0, BufferPlayFlags.Default);
В XNA вам больше не нужен класс Sample и вы можете расширить класс Sound для поддержки всего необходимого, включая MusicManager из Rocket Commander, класс Sample и все остальное из пространства имен Sound игры Rocket Commander.
Из-за структуры XACT, которую мы вскоре обсудим, вы самостоятельно загружаете проект XACT, волновые и звуковые банки. Не беспокойтесь, код для этого очень прост. Вы уже использовали XACT в первых главах для всех аркадных игр.
audioEngine = new AudioEngine("YourSoundProject.xgs"); waveBank = new WaveBank(audioEngine, "Wave Bank.xwb"); soundBank = new SoundBank(audioEngine, "Sound Bank.xsb");
И теперь все, что вам нужно для воспроизведения звука, это вызов:
soundBank.PlayCue(soundName);
Выглядит гораздо проще, не так ли? Вы можете спросить обо всей дополнительной функциональности, которая была реализована для DirectSound. Нет, она не исчезла, но вам надо по-другому думать о звуке в XNA. Звуковые файлы больше не управляются полностью специальным кодом из вашей игры. Вместо этого звуковой проект XACT хранит для вас все предопределенные звуковые параметры. Вместо того, чтобы самому регулировать громкость каждого звука или самостоятельно менять высоту для повторного использования существующих звуков, вы устанавливаете все это внутри утилиты XACT. Это особенно полезно, чтобы сделать одинаковой громкость всех звуковых эффектов или гарантировать, что музыка не будет слишком громкой. Вы можете даже указать, что отдельные звуки могут быть воспроизведены только один раз (подобно фоновой музыке) или разрешить воспроизведение нескольких экземпляров одного и того же звука для озвучивания пожаров и взрывов. Больше об этом вы узнаете в этой главе чуть позже.
И для DirectSound, и для XACT все ваши звуковые файлы должны быть в формате WAV, особенно это касается всех звуковых эффектов. Если у вас есть звуковые файлы в других форматах, вы должны их сперва преобразовать. Например, файлы MP3 не поддерживаются ивы не можете воспроизвести их в DirectSound или перетащить их в проект XACT. Сначала надо преобразовать их в фалы WAV. Обратите внимание, что некоторые файлы WAV не поддерживаются XACT и вы получите предупреждение о неподдерживаемом формате при добавлении звукового файла в волновой банк XACT.
Нелегко убедиться, что музыкальный файл хранится в правильном формате и может быть наилучшим образом сжат в XACT как для Xbox 360, так и для Windows (рис. 9.1).
Рис. 9.1 |
Просто преобразуйте все ваши звуки в файлы WAV формата 16 бит, 44 кГц, стерео PCM, чтобы обеспечить возможность их сжатия. Даже если у вас монофоническая музыка, сохраняйте ее как стереофоническую, а если у вас 8-битные PCM файлы не пытайтесь использовать их. Преобразуйте все в 16-битное стерео, иначе XACT не позволит вам корректно сжимать файлы. Для 8-битных файлов вы получите сообщение об ошибке, показанное на рис. 9.2, а монофонические файлы плохо сжимаются. Ваши 16-битные стереофонические файлы будут терять качество, но выбрав правильный уровень сжатия XMA и ADPCM вы сможете немного подстроить качество звука.
Рис. 9.2 |
Заметьте, что музыкальные файлы не поддерживаются XACT; эта утилита гораздо лучше подходит для звуковых эффектов, чем для музыки. На платформе PC использование файлов ADPCM для вашей музыки не имеет смысла, поскольку есть файлы MP3 и уже появился код для их воспроизведения. На платформе Xbox 360 вы на данный момент не имеете выбора, кроме использования сжатия XMA в XACT для ваших музыкальных файлов.
Вы можете также использовать сжатие для ваших звуковых эффектов, и я рекомендую, чтобы вы пытались применять высокую степень сжатия. Для игр PC весьма необычно использовать сильно сжатые звуковые файлы; вместо этого вы используете файлы более низкого качества (22 кГц, монофонический) поскольку они загружаются быстрее. Использовать файлы MP3 для звуков непрактично, потому что процессор должен распаковывать их каждый раз при воспроизведении, либо вы должны распаковать сразу все файлы в начале игры, что потребует времени. В большинстве случаев добавление нескольких мегабайт к вашей игре не оказывает влияния, но если вы, подобно мне, фанат оптимизации и хотите, чтобы игра была максимально компактной без потери каких-либо возможностей или заметного снижения качества, вы по-прежнему должны будете пробовать сжимать все файлы с различными параметрами, пока они не станут достаточно малы и при этом сохранят хорошее звучание.
Я также во всех играх из этой книги сжимаю все файлы текстур несколько раз, используя различные форматы, чтобы определить, какой формат является оптимальным для каждой текстуры. Например, меню и графика интерфейса очень хорошо сжимаются в формате PNG, поскольку он сохраняет растровые изображения без потери качества, но файлы PNG слишком велики для текстур моделей или текстур ландшафтов. В этом случае используются файлы DDS, которые также дают преимущество экономии видеопамяти, что особенно важно для Xbox 360. Не тратьте попусту вашу память, дисковое пространство или видеопамять — на консолях все это большой дефицит.
Например, игра Rocket Commander из предыдущей главы использует около 15 звуковых файлов (рис. 9.3) и сжатие делает на Xbox 360 игру меньше примерно на 1 Мбайт. Не так много, но здесь каждый бит на счету.
Рис. 9.3 |
Достаточно говорить об основах и форматах файлов; сейчас вы создадите свой первый звуковой проект в XACT.
netlib.narod.ru | < Назад | Оглавление | Далее > |