Главная » Разработка для Windows Phone 7 » Ориентация в приложении на XNA Windows Phone 7

0

По умолчанию в приложениях на XNA для Windows Phone используется альбомная ориентация, возможно, для обеспечения совместимости с другими экранами, используемыми для игр. Поддерживается альбомная ориентация во всех направлениях, так что при переворачивании устройства как на левый, так и на правый бок, ориентация изображения на экране будет меняться соответственно. Если вы предпочитаете игры с портретным расположением, изменить эту настройку не составляет труда. Добавим в конструктор класса Game1 приложения XnaHelloPhone следующие выражения:

graphics.PreferredBackBufferWidth = 320; graphics.PreferredBackBufferHeight = 480;

Задний буфер – это область, в которой XNA создает графические элементы, выводимые на экран методом Draw. И размером, и пропорциями этого буфера можно управлять. Поскольку заданная здесь ширина буфера меньше его высоты, XNA предполагает, что изображение требуется выводить в портретном режиме:

Посмотрите на это! Соотношение размеров заднего буфера отличаются от пропорций экрана устройства Windows Phone 7, поэтому изображение выводится с черными полосами вверху и внизу экрана! Текст имеет тот же размер в пикселах, но выглядит больше, потому что разрешение экрана уменьшилось.

Даже пусть вы не являетесь большим поклонником такой зернистости изображения, вызывающей ностальгические воспоминания, но подумайте о применении меньшего заднего буфера, если игре не требуется такое высокое разрешение, какое предоставляет экран телефона. Это обеспечит повышение производительности и снизит энергопотребление. Размер заднего буфера может быть любым в диапазоне от 240 х 240 до 480 х 800 (для портретного режима) или 800 х 480 (для альбомного). XNA использует соотношение размеров для определения используемого режима отображения.

Задание необходимого заднего буфера является замечательным способом ориентировать приложение на экран определенного размера в коде, но также обеспечивает возможности применения устройств с другими размерами экранов, которые могут появиться в будущем.

По умолчанию размер заднего буфера равен 800 х 480, но его фактический размер на экране несколько меньше, поскольку требуется обеспечить место для панели задач. Чтобы избавиться от панели задач (и досадить пользователям, которые всегда хотят знать, который сейчас час), в конструкторе Game1 можно задать:

graphics.IsFullScreen = true;

Кроме того, можно сделать так, чтобы игры на XNA реагировали на изменения ориентации экрана, но для этого, конечно же, придется немного изменить их структуру. Самый простой тип реструктуризации для обеспечения учета изменения ориентации продемонстрирован в проекте XnaOrientableHelloPhone. Его поля теперь включают переменную textSize (Размер текста):

Проект XNA: XnaOrientableHelloPhone Файл: Game1.cs (фрагмент демонстрирующий поля)

public class Gamel : Microsoft.Xna.Framework.Game {

GraphicsDeviceManager graphics; SpriteBatch spriteBatch;

string text = "Hello, Windows Phone 7!"; SpriteFont segoe14; Vector2 textSize; Vector2 textPosition;

}

Конструктор Game1 включает выражение, определяющее свойство SupportedOrientations поля graphics:

Проект XNA: XnaOrientableHelloPhone Файл: Game1.cs (фрагмент)

public Game1() {

graphics = new GraphicsDeviceManager(this); Content.RootDirectory = "Content";

// Делаем возможным отображение и в портретном режиме graphics.SupportedOrientations = DisplayOrientation.Portrait |

DisplayOrientation.LandscapeLeft | DisplayOrientation.LandscapeRight;

// По умолчанию для Windows Phone частота кадров составляет 30 кадр/с. TargetElapsedTime = TimeSpan.FromTicks(333333);

}

Применяя SupportedOrientation, можно ограничить поддерживаемые телефоном режимы отображения. Это выражение, обеспечивающее поддержку и портретного, и альбомного режима отображения, выглядит простым, но здесь имеются некоторые побочные эффекты. При изменении ориентации происходит сброс графического устройства (что приводит к формированию некоторых событий), и размеры заднего буфера изменяются. Можно подписаться на событие OrientationChanged класса GameWindow (Игровое окно) (которое доступно через свойство Window (Окно)) либо проверять свойство CurrentOrientation (Текущая ориентация) объекта GameWindow.

Я выбрал несколько иной подход. Рассмотрим новый метод LoadContent, который, как можно будет заметить, принимает размер текста и сохраняет его как поле, но не получает размеров окна просмотра.

Проект XNA: XnaOrientableHelloPhone Файл: Game1.cs (фрагмент)

protected override void LoadContent() {

spriteBatch = new SpriteBatch(GraphicsDevice); segoe14 = this.Content.Load<SpriteFont>("Segoe14"); textSize = segoe14.MeasureString(text);

}

Параметры окна просмотра можно получить в ходе выполнения метода Update, поскольку размеры окна просмотра отражают ориентацию экрана.

Проект XNA: XnaOrientableHelloPhone Файл: Game1.cs (фрагмент)

protected override void Update(GameTime gameTime) {

// Обеспечивает возможность выхода из игры

if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) this.Exit ();

Viewport viewport = this.GraphicsDevice.Viewport; textPosition = new Vector2((viewport.Width – textSize.X) / 2,

(viewport.Height – textSize.Y) / 2);

base.Update(gameTime);

}

Какой бы ни была текущая ориентация, метод Update вычисляет положение текста. Метод Draw аналогичен тем, что были представлены ранее.

Проект XNA: XnaOrientableHelloPhone Файл: Game1.cs (фрагмент)

protected override void Draw(GameTime gameTime) {

GraphicsDevice.Clear(Color.Navy); spriteBatch.Begin();

spriteBatch.DrawString(segoe14, text, textPosition, Color.White); spriteBatch.End();

base.Draw(gameTime);

}

Теперь телефон или эмулятор можно переворачивать в разных направлениях, и изображение на экране будет менять ориентацию соответственно.

Если требуется получить размер экрана телефона независимо от заднего буфера или ориентации (но с учетом панели задач), сделать это можно с помощью свойства ClientBounds (Границы клиентской области) класса GameWindow, обратиться к которому можно из свойства Window класса Game:

Rectangle clientBounds = this.Window.ClientBounds;

Источник: Чарльз Петзольд, Программируем Windows Phone 7, Microsoft Press, © 2011.

По теме:

  • Комментарии