Lecture

Created: 09.04.2009 | Level: specialist | Access: free
Самостоятельная работа 7:

Озвучивание игр

Annotation: В этой лабораторной работе мы займемся озвучиванием игр.

Примеры к лабораторной работе

Задачи работы

  • Освоить основные операции по работе с WAV-файлами
  • Освоить инструменты XACT для создания XAP-проектов
  • Научиться проигрывать фоновую музыку в играх
  • Научиться проигрывать звуки, соответствующие различным игровым событиям

Этапы озвучивания игры

Для того, чтобы озвучить игру, нужно проделать следующие шаги:

  1. Подготовить WAV-файлы. Звуковое оформление игры состоит из двух частей. Во-первых – это фоновая музыка, которая может меняться в зависимости от отображаемого игрового экрана или игрового уровня, и звуки, соответствующие игровым событиям.
  2. Создать новый XNA-проект (можно озвучивать и уже созданные игры, в которых звуковое оформление не применялось)
  3. Создать в папке Content отдельную папку для хранения звуковых файлов, например, назвав ее Audio, скопировать в эту папку подготовленные файлы
  4. Создать новый XACT-проект и сохранить его в папке Audio игрового проекта.
  5. Добавить WAV-файлы в проект, сформировать WaveBank и SoundBank
  6. Загрузить XACT-проект в игру
  7. Включить воспроизведение фоновой музыки, которая обычно зацикливается
  8. Включать воспроизведение нужных звуковых фрагментов при возникновении соответствующих событий.

Озвучивание игры

Создадим новый стандартный игровой проект 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.).

Окно программы после добавления звуковых банков

увеличить изображение
Рис. 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