Опубликован: 14.08.2012 | Уровень: специалист | Доступ: платный
Самостоятельная работа 26:

Озвучивание игр, видео

Перейдем к коду приложения, к странице MainPage.xaml.cs. В листинге 33.2 приведен её код

using System;
using System.Windows.Input;
using System.Windows.Media;
using Microsoft.Phone.Controls;
using System.Windows.Resources;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
namespace P26_1
{
    public partial class MainPage : PhoneApplicationPage
    {
        //Для перемещения объекта
        double speedAndDirX = 0;
        double speedAndDirY = 0;
        //Для звуков и музыки
        SoundEffect sound;
        SoundEffect backMusic;
        //Используется для управления проигрыванием
        SoundEffectInstance backMusicInstance;
        public MainPage()
        {
            InitializeComponent();
            //Загружаем звуки
            LoadSound("Res/SoundFx1.wav", out sound);
            LoadSound("Res/Music.wav", out backMusic);
            //Работаем с SoundEffectInstance
            backMusicInstance = backMusic.CreateInstance();
            //Настраиваем параметры воспроизведения музыки
            backMusicInstance.IsLooped = true;
            backMusicInstance.Volume = 0.5f;
            //Запустим проигрывание музыки
            backMusicInstance.Play();
            //Изменим положение и скорость объекта
            ChangeDir();
            //Добавим обработчик события Rendering
            CompositionTarget.Rendering += new EventHandler(CompositionTarget_Rendering);
        }
        //В обработчике события Rendering
        void CompositionTarget_Rendering(object sender, EventArgs e)
        {
            //Выполним метод Update для обеспечения работоспособности XNA-механизмов
            FrameworkDispatcher.Update();
            //Изменим позицию объекта
            translate.X += speedAndDirX;
            translate.Y += speedAndDirY;
            //Проверим на столкновение объекта с границами экрана
            CheckBounds();
        }
        //При прикосновении к эллипсу
        private void ellipse1_Tap(object sender, GestureEventArgs e)
        {
            //Поменяем позицию, скорость, направление движения объекта
            ChangeDir();
            //Проиграем звук
            sound.Play();
        }

        void ChangeDir()
        {
            //Для работы со случайными числами
            Random r = new Random();
            //Получим новые значения направления и скорости
            speedAndDirX = r.Next(5) - r.Next(5);
            speedAndDirY = r.Next(5) - r.Next(5);
            //Установим объект в новую позицию на экране, не пересекая границ экрана
            translate.X = r.Next(700);
            translate.Y = r.Next(380);
        }
        //Проверим на столкновение с границами
        void CheckBounds()
        {
            //При пересечении границ инвертируем направление
            if (translate.X < 0 || translate.X > 700)
            {
                speedAndDirX = -speedAndDirX;
            }
            if (translate.Y < 0 || translate.Y > 380)
            {
                speedAndDirY = -speedAndDirY;
            }
        }
        //Загрузка звуковых ресурсов
        void LoadSound(string FilePath, out SoundEffect Sound)
        {
            //Сформируем информацию о потоке
            StreamResourceInfo SoundFileInfo = App.GetResourceStream(new Uri((FilePath), UriKind.Relative));
            //Создаем новый объект SoundEffect из потока
            Sound = SoundEffect.FromStream(SoundFileInfo.Stream);
        }

    }
}
Листинг 33.2. Код MainPage.xaml.cs

В код мы, во-первых, подключаем пространства имен Microsoft.Xna.Framework и Microsoft.Xna.Framework.Audio. Мы определяем переменные для управления объектом, пару переменных типа SoundEffect для работы со звуками и музыкой и одну переменную SoundEffectInstance, которая используется для настройки параметров воспроизведения фоновой музыки.

Мы создали метод LoadSound, передавая которому адрес, где хранится нужная композиция, мы устанавливаем загруженную композицию в соответствующую переменную. Это мы делаем в конструкторе класса. Здесь же мы создаём из объекта SoundEffect объект SoundEffectInstance, настраиваем его параметры и запускаем воспроизведение фоновой музыки. Далее в конструкторе мы вызываем метод ChangeDir(), который случайным образом, в пределах границ экрана, изменяет положение объекта и задаёт параметры его передвижения. Так же в конструкторе мы запускаем "двигатель" всего нашего проекта – а именно подключаем обработчик события CompositionTarget.Rendering.

Этот обработчик используется для анимации (пример с ним мы рассматривали ранее), и, что очень важно для звуковой составляющей нашей игры, для вызова метода FrameworkDispatcher.Update(). Этот вызов обеспечивает работу механизмов XNA. В XNA-проектах, где реализован класс Game, данный метод вызывается автоматически. Частота, с которой вызывается CompositionTarget.Rendering (каждое обновление экрана, другими словами, то есть – около 30 раз в секунду) вполне достаточна для нормальной работы механизмов XNA.

В том же обработчике мы вызываем метод CheckBounds, который проверяет, не пересечены ли границы экрана, и если это произошло – меняет направление по соответствующей координате на противоположное. Выполнять подобные манипуляции здесь мы можем, так как значения X и Y объекта translate в данном случае соответствуют экранным координатам игрового объекта.

И, наконец, в обработчике прикосновения к эллипсу мы вызываем метод ChangeDir(), объект перемещается в новую экранную позицию и начинает движение в новом направлении с измененной скоростью, и воспроизводим звук, назначенный нами на данное событие.

Рассмотрим еще один пример, касающийся воспроизведения видео и звуков средствами Silverlight.

Гулич Анна
Гулич Анна
Невозможно пройти тесты, в окне с вопросами пусто
Сашечка Огнев
Сашечка Огнев
Россия, Красноярский край
Андрей Корягин
Андрей Корягин
Россия, Пенза, Вазерская средняя школа, 2001