Невозможно пройти тесты, в окне с вопросами пусто |
Использование данных о местоположении, другие способы управления
Цель работы: Научиться работать с данными о географическом положении, использовать жесты для управления программами
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 вы можете видеть программу, запущенную в эмуляторе. Обратите внимание на то, что среди дополнительных инструментов эмулятора есть средство для эмуляции географических координат.