Опубликован: 12.02.2013 | Доступ: свободный | Студентов: 791 / 47 | Длительность: 17:51:00
Специальности: Программист
Самостоятельная работа 14:

Совместное использование Silverlight и XNA

< Самостоятельная работа 13 || Самостоятельная работа 14 || Лекция 9 >
Аннотация: Цель работы: изучение возможностей совместного использования технологий Silverlight и XNA в программе для Windows Phone.

Основные теоретические сведения

Можно создать решение Visual Studio, содержащее и приложение Silverlight, и компонент игры XNA. Эту возможность удобно использовать, например, для создания игровых меню, или можно добавить элементы 3D графики в приложение Silverlight.

Для этого нужно создать решение Visual Studio, используя шаблон Приложение Silverlight и XNA для Windows Phone. Новое решение содержит три проекта.

Главным проектом будет приложение Silverlight, которое является начальным проектом. Второй проект содержит набор необходимых библиотек. Третий предназначен для хранения контента XNA для игровой части решения.

При создании объединённого приложения также будет создана новая страница Silverlight, которая будет содержать игру XNA. Игровой процесс XNA размещается на странице GamePage.

Создание игровой среды XNA в Silverlight

При запуске игры XNA вызывается набор методов для инициализации игры, загрузки игрового контента и периодического выполнения обновления игрового мира и его перерисовки на экране. Когда игра работает на странице Silverlight, необходимо обеспечить выполнение этих действий.

protected override void OnNavigatedTo(NavigationEventArgs e) 
protected override void OnNavigatedFrom(NavigationEventArgs e)
private void OnUpdate(object sender, GameTimerEventArgs e)
private void OnDraw(object sender, GameTimerEventArgs e)

Эти методы находятся на странице игры, и их необходимо заполнить. Метод OnNavigatedTo выполняет функции методов Initialise и LoadContent, а методы OnUpdate и OnDraw выполняют функции методов Update и Draw соответственно. Метод OnNavigatedTo всегда вызывается, когда пользователь переходит на страницу, и здесь игра должна загрузить контент и начать выполнение. Этот метод также создаёт таймер, который выполняет вызовы методов OnUpdate и OnDraw во время работы игры.

Обратите внимание, что программа XNA работает на странице Silverlight, и пользователь может перейти на другую страницу приложения. При этом вызывается метод OnNavigatedFrom, который можно использовать, чтобы автоматически приостановить игру при переходе на другую страницу приложения.

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

private void Button_Click(object sender, RoutedEventArgs e)
{  
    NavigationService.Navigate(new Uri("/GamePage.xaml", UriKind.Relative));
}

Если во время работы игры нажать кнопку телефона Назад, то произойдёт переход к предыдущей странице, и игра закроется. Обратите внимание, что игра перезапускается каждый раз при переходе на страницу. При этом, игра перезагружает все текстуры и игровые ресурсы. Было бы разумно сохранить текстуры и состояние игры в отдельном классе и кэшировать данные, чтобы пользователь мог вернуться на то место в игре, на котором он закончил её в прошлый раз.

Взаимодействие XNA и Silverlight

Существует возможность наложить визуальные элементы Silverlight поверх игры XNA. Это позволяет легко добавить к игре кнопки и текст, используя элементы Button и TextBlock. Для добавления элементов Silverlight на экран игры сначала нужно создать элементы и добавить их в файл GamePage.xaml:

<Grid x:Name="LayoutRoot">
    <StackPanel>
        <TextBlock x:Name="ScoreTextBlock" Text="0:0" TextAlignment="Center"
            Style="{StaticResource PhoneTextTitle1Style}" />
        <Button Content="Quit" Name="quitButton" Width="480"
            Click="quitButton_Click" />
    </StackPanel>
</Grid>

Этот код создаёт элемент StackPanel с кнопкой и блоком текста. Кнопка будет завершать игру, а в текстовом блоке будет отображаться счёт игры.

Теперь эти элементы нужно вывести на экран. Рендеринг элементов Silverlight выполняется в классе UIElementRenderer. Экземпляр этого класса создаётся при загрузке страницы:

UIElementRenderer elementRenderer;

if (elementRenderer == null)
{
    elementRenderer = new UIElementRenderer(this, (int)ActualWidth,
        (int)ActualHeight);
}

Этот код проверяет, существует ли elementRenderer, и если нет — создаёт его. Обратите внимание, конструктор этого элемента принимает в качестве параметров ссылку на используемую страницу, ширину и высота области для отрисовки.

Теперь этот объект можно использовать его в методе OnDraw для создания элементов Silverlight:

private void OnDraw(object sender, GameTimerEventArgs e)
{

    // рендеринг элементов Silverlight с помощью объекта UIElementRenderer
    elementRenderer.Render();

    SharedGraphicsDeviceManager.Current.GraphicsDevice.Clear(Color.CornflowerBlue);

    spriteBatch.Begin();

    spriteBatch.Draw(ballTexture, ballRectangle, Color.White);
    
    ...

    spriteBatch.Draw(elementRenderer.Texture, Vector2.Zero, Color.White);

    spriteBatch.End();
}

Элементы Silverlight будут выводиться поверх игровых объектов. Если нужно использовать элементы Silverlight в качестве фона для игры, их нужно выводить первыми. Во время работы игры XNA элементы Silverlight отвечают на действия пользователя, и их можно связать с обработчиками событий. Обработчики событий элементов можно использовать даже если элементы не выводятся на экран.

Дополнительные материалы

Сайт MSDN: http://msdn.microsoft.com/ru-ru/library/hh202931.

Задание к работе

  1. Создайте в Visual Studio проект программы для Windows Phone, использующей технологии Silverlight и XNA.
  2. Добавьте в проект XNA код, созданный в предыдущей работе.
  3. Добавьте в проект Silverlight необходимые элементы и код для запуска проекта XNA.
  4. Добавьте в программу необходимый код для приостановки программы XNA, когда пользователь нажимает кнопку Назад, и возобновления программы XNA, когда пользователь возвращается к ней.
  5. Запустите программу и проверьте правильность её работы.
  6. Составьте отчёт о проделанной работе. Включите в отчёт необходимые листинги программы.
< Самостоятельная работа 13 || Самостоятельная работа 14 || Лекция 9 >