| Невозможно пройти тесты, в окне с вопросами пусто |
Использование данных о местоположении, другие способы управления
Цель работы: Научиться работать с данными о географическом положении, использовать жесты для управления программами
13.1. Географические координаты
Для управления играми, написанными для Windows Phone, можно пользоваться самыми разными датчиками. В частности, датчиком местоположения. В XNA-проекте мы можем получать данные о местоположении устройства, выраженные в географических координатах, от встроенного GPS-приемника, который дополняется системой A-GPS.
Данные о местоположении, получение которых мы сейчас рассмотрим, позволяют определить географические координаты устройства, скорость перемещения, высоту над уровнем моря, курс движения.
Создадим новый стандартный XNA-проект (P7_1). Для использования служб работы с местоположением нам понадобится подключить (в разделе Ссылки игрового проекта) библиотеку System.Device, пространство имён System.Device.Location.
В данном проекте, листинг 13.1., мы будем получать данные о местоположении устройства и выводить их на экран.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Device.Location;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Input.Touch;
using Microsoft.Xna.Framework.Media;
namespace P7_1
{
/// <summary>
/// Это главный тип игры
/// </summary>
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
//Строка для вывода
string text="Please wait";
//Для хранения позиции вывода текста
Vector2 textPosition = new Vector2(100, 100);
//Для хранения шрифта
SpriteFont MyFont;
//Объект для работы с данными о местоположении
GeoCoordinateWatcher GeoWatch;
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
//Отображение игрового окна на полный экран, без строки состояния
graphics.IsFullScreen = true;
// Частота кадра на Windows Phone по умолчанию — 30 кадров в секунду.
TargetElapsedTime = TimeSpan.FromTicks(333333);
// Дополнительный заряд аккумулятора заблокирован.
InactiveSleepTime = TimeSpan.FromSeconds(1);
}
/// <summary>
/// Позволяет игре выполнить инициализацию, необходимую перед запуском.
/// Здесь можно запросить нужные службы и загрузить неграфический
/// контент. Вызов base.Initialize приведет к перебору всех компонентов и
/// их инициализации.
/// </summary>
protected override void Initialize()
{
//Новый объект для работы с местоположением
GeoWatch = new GeoCoordinateWatcher();
//Обработчик события, которое происходит при изменении местоположения
GeoWatch.PositionChanged += new EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>(GeoWatch_PositionChanged);
//Запуск сервиса
GeoWatch.Start();
base.Initialize();
}
void GeoWatch_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
{
//Записываем в переменную для вывода на экран следующие данные:
//Широта
//Долгота
//Высота
//Курс
//Скорость
//Отметка времени
text = String.Format("Latitude: {0}\r\n" +
"Longitude: {1}\r\n" +
"Altitude: {2}\r\n" +
"Course: {3}\r\n"+
"Speed: {4}\r\n"+
"Current time: {5}",
e.Position.Location.Latitude,
e.Position.Location.Longitude,
e.Position.Location.Altitude,
e.Position.Location.Course,
e.Position.Location.Speed,
e.Position.Timestamp);
}
///// <summary>
/// LoadContent будет вызываться в игре один раз; здесь загружается
/// весь контент.
/// </summary>
protected override void LoadContent()
{
// Создайте новый SpriteBatch, который можно использовать для отрисовки текстур.
spriteBatch = new SpriteBatch(GraphicsDevice);
//Загружаем шрифт
MyFont = Content.Load<SpriteFont>("MyFont");
}
/// <summary>
/// UnloadContent будет вызываться в игре один раз; здесь выгружается
/// весь контент.
/// </summary>
protected override void UnloadContent()
{
// ЗАДАЧА: выгрузите здесь весь контент, не относящийся к ContentManager
}
/// <summary>
/// Позволяет игре запускать логику обновления мира,
/// проверки столкновений, получения ввода и воспроизведения звуков.
/// </summary>
/// <param name="gameTime">Предоставляет моментальный снимок значений времени.</param>
protected override void Update(GameTime gameTime)
{
// Позволяет выйти из игры
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
base.Update(gameTime);
}
/// <summary>
/// Вызывается, когда игра отрисовывается.
/// </summary>
/// <param name="gameTime">Предоставляет моментальный снимок значений времени.</param>
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin();
//Выводим строку
spriteBatch.DrawString(MyFont, text, textPosition, Color.Red,
0, new Vector2(0, 0), 1.0f, SpriteEffects.None, 0.5f);
spriteBatch.End();
base.Draw(gameTime);
}
}
}
Листинг
13.1.
Код класса Game1
В данном проекте мы пользуемся классом GeoCoordinateWatcher(), создаем обработчик события PositionChanged, в коде которого записываем полученные от устройства данные в текстовую переменную для вывода на экран.
На рис. 13.1 вы можете видеть программу, запущенную в эмуляторе. Обратите внимание на то, что среди дополнительных инструментов эмулятора есть средство для эмуляции географических координат.
