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