| Невозможно пройти тесты, в окне с вопросами пусто |
Совместное использование Silverlight и XNA
35.2. Пример приложения
Реализуем в новом окружении пример, аналогичный проекту P5_1, который мы рассматривали на пятом практическом занятии. Здесь игровой объект перемещался по экрану в позицию касания экрана.
Создадим новый проект по шаблону Приложение Silverlight и XNA для Windows Phone, назовём проект P28_2.
На странице MainPage.xaml изменим заголовок страницы на "ПЕРВАЯ ИГРА", поменяем подпись к кнопке на "Играть!". В листинге 35.7. приведен измененный код измененной страницы.
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="800"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
shell:SystemTray.IsVisible="False">
<!--LayoutRoot представляет корневую сетку, где размещается все содержимое страницы-->
<Grid x:Name="LayoutRoot" Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!--TitlePanel содержит имя приложения и заголовок страницы-->
<StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
<TextBlock x:Name="ApplicationTitle" Text="МОЕ ПРИЛОЖЕНИЕ"
Style="{StaticResource PhoneTextNormalStyle}"/>
<TextBlock x:Name="PageTitle" Text="первая игра" Margin="9,-7,0,0"
Style="{StaticResource PhoneTextTitle1Style}"/>
</StackPanel>
<!--ContentPanel — поместите здесь дополнительное содержимое-->
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<!--Создание одной кнопки для перехода ко второй странице, визуализация которой выполнена XNA Framework-->
<Button Height="100" Content="Играть!" Click="Button_Click" Margin="0,410,0,129" />
</Grid>
</Grid>
</phone:PhoneApplicationPage>
Листинг
35.7.
Файл MainPage.xaml
Теперь добавим в проект P28_2LibContent изображение для визуализации. Делается это командой контекстного меню проекта Добавить > Существующий элемент. В итоге наш проект будет выглядеть следующим образом, рис. 35.4.
Вся остальная работа над игрой ведется в файле GamePage.xaml.cs. В листинге 35.8 приведен его полный код.
using System;
using System.Windows;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input.Touch;
namespace P28_2
{
public partial class GamePage : PhoneApplicationPage
{
// Менеджер контента
ContentManager contentManager;
// Таймер для организации игрового цикла
GameTimer timer;
// Объект для вывода 2D-графики
SpriteBatch spriteBatch;
// Текстура для хранения изображения
private Texture2D mySprite;
//Позиция вывода изображения
private Vector2 position = new Vector2(0, 200);
public GamePage()
{
InitializeComponent();
// Получить диспетчер содержимого из приложения
contentManager = (Application.Current as App).Content;
// Создайте таймер для этой страницы
timer = new GameTimer();
timer.UpdateInterval = TimeSpan.FromTicks(333333);
timer.Update += OnUpdate;
timer.Draw += OnDraw;
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
// В графическом устройстве включите визуализацию XNA для режима совместного использования
SharedGraphicsDeviceManager.Current.GraphicsDevice.SetSharingMode(true);
// Создание нового SpriteBatch, который может использоваться для рисования текстур.
spriteBatch = new SpriteBatch(SharedGraphicsDeviceManager.Current.GraphicsDevice);
// Загружаем игровой контент
mySprite = contentManager.Load<Texture2D>("ball");
// Запуск таймера
timer.Start();
base.OnNavigatedTo(e);
}
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
// Остановка таймера
timer.Stop();
// В графическом устройстве выключите визуализацию XNA для режима совместного использования
SharedGraphicsDeviceManager.Current.GraphicsDevice.SetSharingMode(false);
base.OnNavigatedFrom(e);
}
/// <summary>
/// Позволяет странице выполнять логику, такую как обновление окружения,
/// поиск конфликтов, сбор входных данных и воспроизведение звука.
/// </summary>
private void OnUpdate(object sender, GameTimerEventArgs e)
{
//Получаем коллекцию объектов, содержащих информацию о касаниях экрана
TouchCollection touchLocations = TouchPanel.GetState();
//Перебираем коллекцию, присваивая объекту координаты касания
foreach (TouchLocation touchLocation in touchLocations)
{
if (touchLocation.State == TouchLocationState.Pressed)
{
position = touchLocation.Position;
}
}
}
/// <summary>
/// Разрешает автоматическую прорисовку страницы.
/// </summary>
private void OnDraw(object sender, GameTimerEventArgs e)
{
// Очищаем экран
SharedGraphicsDeviceManager.Current.GraphicsDevice.Clear(Color.CornflowerBlue);
// Выводим изображение
spriteBatch.Begin();
spriteBatch.Draw(mySprite, position, Color.White);
spriteBatch.End();
}
}
}
Листинг
35.8.
Файл GamePage.xaml.cs
Обратите внимание на то, что для работы с сенсорным вводом нам понадобилось подключить пространство имён Microsoft.Xna.Framework.Input.Touch.
Если сопоставить этот код с кодом на XNA, выполняющим схожую функциональность, то окажется, что в данном случае иначе выглядит лишь код загрузки игрового ресурса (всё дело лишь в другом имени объекта):
mySprite = contentManager.Load<Texture2D>("ball");
Листинг
35..
В целом же наш простой пример в модификации практически не нуждался (если не учитывать необходимость располагать соответствующий код в методах, выполняющих ту же функциональность, что и в XNA, но с другими именами). В итоге мы получили следующее, рис. 35.5.
Обратите внимание на то, что начало координат расположено в левом верхнем углу экрана, экран по умолчанию расположен в портретной ориентации.
35.3. Выводы
В данной лабораторной работе мы рассмотрели шаблон Приложение Silverlignt и XNA для Windows Phone. Он позволяет объединять в одном приложении возможности XNA и Silverlight.
35.4. Задание
Выберите один из проектов, которыми мы занимались ранее, изучая построение приложений для XNA, реализуйте его с помощью шаблона Приложение Silverlignt и XNA для Windows Phone.

