Для того, чтобы озвучить игру, нужно проделать следующие шаги:
Создадим новый стандартный игровой проект P7_1. С помощью Solution Explorer создадим папку Audio в разделе Content. Найдем его папку в файловой системе компьютера, пройдем в директорию Content \[ \Rightarrow \] Audio. Скопируем туда три WAV-файла – s1.wav, s2.wav, music.wav. Эти файлы мы взяли в бесплатной библиотеке аудиофайлов http://www.koumis.com . Файлы в библиотеке представлены в формате MP3, мы конвертировали их в формат WAV с помощью аудиоредактора GoldWave.
Выполним команду меню Пуск \[ \Rightarrow \] Все программы \[ \Rightarrow \] Microsoft XNA Game Studio 2.0 \[ \Rightarrow \] Tools \[ \Rightarrow \] XACT auditioning utility. Этой командой мы запустили Auditioning-сервер, который нужен для проигрывания музыки в XACT. Теперь запустим XACT командой Пуск \[ \Rightarrow \] Все программы \[ \Rightarrow \] Microsoft XNA Game Studio 2.0 \[ \Rightarrow \] Tools \[ \Rightarrow \] Microsoft Cross Platform Audio Creation Tool (XACT). На рис. 11.1. вы можете видеть стартовое окно XACT.
Командой File \[ \Rightarrow \] New Project создадим новый XACT-проект, назовем его xP7_1 и сохраним в папке Audio нашего игрового проекта.
Щелкнем правой кнопкой мыши по миниатюре Wave Banks, которая находится в левой части окна программы и в появившемся меню щелкнем пункт New Wave Bank, дадим новому банку Wave-файлов имя Sounds. Wave-банки предназначены для хранения Wave-файлов, которые мы планируем включить в игру. Теперь щелкнем правой кнопкой мыши по пункту Sound Banks, выберем в появившемся меню пункт New Sound Bank, назовем новый звуковой банк SoundBank. Расположим окна двух банков в окне программы. Вот как должен выглядеть экран программы после этих действий (рис. 11.2.).
В Wave-банк мы должны добавить файлы, которые подготовлены ранее. Для этого нужно щелкнуть правой кнопкой мыши в поле окна Sounds (Wave Bank) и в появившемся меню выбрать пункт Insert Wave Files. В появившемся окне (автоматически будет открыта папка Audio нашего проекта) выберем нужные файлы и нажмем кнопку Открыть. Файлы появятся в окне Wave-банка. Теперь выделим значки файлов в этом окне и перетащим их в окно SoundBank (Sound Bank), в его поле Cue Name. Автоматически будут созданы закладки, которые мы будем использовать в игре для проигрывания соответствующих звуков. Звуки s1.wav и s2.wav будут соответствовать некоторым игровым событиям. Они будут проигрываться при наступлении определенного события в игре. А звук music.wav – фоновая музыка – будет проигрываться все время, пока игра запущена. Для того, чтобы он проигрывался циклически, нам нужно настроить его свойства. Выделим его в поле Sound Name и в панели свойств звука (она расположена в левой нижней части окна программы) установим флажок Infinite в группе параметров Looping. На данный момент это все, что нам нужно сделать в XACT. Сохраним проект и закроем окно редактора и XACT Auditioning Utility. Вернемся к игровому проекту P7_1. В окне Solution Explorer добавим XACT-проект в игру. Для того, чтобы воспользоваться звуками, нам нужно загрузить звуковые ресурсы.
Используем в данном проекте игровой компонент spriteComp из проекта P4_3, модифицировав его таким образом, чтобы при столкновении объекта, созданного на его основе, со стенами, воспроизводился звук s1.wav, и чтобы при щелчке мышью по этому объекту воспроизводился звук s2.wav. Так же добавим в нашу игру возможность приостанавливать и возобновлять проигрывание фоновой музыки по нажатию клавиш A и S соответственно.
В листинге 11.1. приведен код класса Game1.
using System; using System.Collections.Generic; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.GamerServices; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Net; using Microsoft.Xna.Framework.Storage; namespace P7_1 { public class Game1 : Microsoft.Xna.Framework.Game { GraphicsDeviceManager graphics; SpriteBatch spriteBatch; //Переменная для работы с аудиоустройством AudioEngine audioEngine; //Переменная для работы с Wave-банком WaveBank waveBank; //Переменная для работы с Sound-банком SoundBank soundBank; //Переменная для работы с фоновой музыкой игры Cue musicCue; Texture2D texture; public Game1() { graphics = new GraphicsDeviceManager(this); Content.RootDirectory = "Content"; } protected override void Initialize() { //Загружаем аудиоресурсы для игры audioEngine = new AudioEngine("Content\\Audio\\xP7_1.xgs"); waveBank = new WaveBank(audioEngine, "Content\\Audio\\Sounds.xwb"); soundBank = new SoundBank(audioEngine, "Content\\Audio\\SoundBank.xsb"); //Присваиваем переменной ссылку на закладку с именем Music musicCue = soundBank.GetCue("Music"); //Включаем проигрывание фоновой музыки musicCue.Play(); this.IsMouseVisible = true; base.Initialize(); } protected override void LoadContent() { // Create a new SpriteBatch, which can be used to draw textures. spriteBatch = new SpriteBatch(GraphicsDevice); Services.AddService(typeof(SpriteBatch), spriteBatch); texture = Content.Load<Texture2D>("BallandBats"); // Создаем игровые объекты for (int i=1;i<5;i++) { Components.Add(new spriteComp(this, ref texture, new Rectangle(16, 203, 17, 17), i, this, soundBank)); } } protected override void UnloadContent() { // TODO: Unload any non ContentManager content here } protected override void Update(GameTime gameTime) { //Блок управления проигрыванием по нажатию клавиш //При нажатии клавиши A приостанавливаем проигрывание KeyboardState kbState = Keyboard.GetState(); if (kbState.IsKeyDown(Keys.A)) { musicCue.Pause(); } //При нажатии клавиши S продолжаем проигрывание музыки if (kbState.IsKeyDown(Keys.S)) { musicCue.Resume(); } audioEngine.Update(); base.Update(gameTime); } protected override void Draw(GameTime gameTime) { graphics.GraphicsDevice.Clear(Color.CornflowerBlue); // TODO: Add your drawing code here spriteBatch.Begin(); base.Draw(gameTime); spriteBatch.End(); } } }Листинг 11.1. Код класса Game1