Невозможно пройти тесты, в окне с вопросами пусто |
Озвучивание игр, видео
Перейдем к коду приложения, к странице 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.