Опубликован: 14.08.2012 | Уровень: специалист | Доступ: платный
Самостоятельная работа 7:

Использование данных о местоположении, другие способы управления

13.2. Обработка жестов, вибрация

На одном из предыдущих занятий мы рассматривали обработку события простого касания в XNA. Windows Phone, помимо обычных касаний, поддерживает большой набор жестов, распознавая которые, можно значительно расширить способы управления игрой.

Windows Phone поддерживает распознавание множества жестов. В частности, таких, как FreeDrag – то есть – свободное перетаскивание по экрану, DoubleTap – быстрое двойное касание экрана. Flick – касание с быстрым перемещением, Hold – касание и удержание пальца на панели, Pinch – сведение или разведение двух пальцев на панели, обычно используется для целей масштабирования объектов. Эти и другие жесты позволяют реализовать самые разные схемы управления объектами на экране. Например, объекты можно "раскладывать" по экрану в нужной последовательности, управлять скоростью и направлением их перемещения, масштабировать – здесь всё зависит от целей и фантазии разработчика. В нашем примере мы используем обработку двух жестов – FreeDrag и DoubleTap.

Кроме того, мы включили в пример работу с виброзвонком телефона. В определенный момент мы будем включать вибрацию. Этот приём часто используется в играх для того, чтобы добавить им реалистичности. Например, устройство может вибрировать при столкновении каких-то объектов, при падении и во многих других случаях.

Обработка жестов не требует каких-то дополнительных действий, всё, что нужно, уже подключено в стандартном проекте. Для работы с вибрацией нам понадобится подключить библиотеку Microsoft.Phone и пространство имен Microsoft.Devices

Кроме того, здесь мы, в учебных целях, рассмотрим удобный механизм отладки приложений с использованием сообщений, выводимых в окно отладчика. Для этого нам понадобится пространство имён System.Diagnostics.

Новый стандартный XNA-проект (P7_2) содержит игровой компонент, spriteComp.cs – это модифицированная версия использованного ранее компонента, один графический ресурсrectangle.pngпрямоугольник, который мы будем перемещать по экрану. Внешний вид окна Обозреватель решений вы можете видеть на рис. 13.2.

Игровой проект P7_2

Рис. 13.2. Игровой проект P7_2

В листинге 13.2 вы можете видеть код игрового компонента

using System;
using System.Collections.Generic;
using System.Linq;
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.Media;
//Подключим для отладочных целей
using System.Diagnostics;

namespace P7_2
{
    /// <summary>
    /// Это игровой компонент, реализующий интерфейс IUpdateable.
    /// </summary>
    public class spriteComp : Microsoft.Xna.Framework.DrawableGameComponent
    {
        //Изображение
        private Texture2D sprTexture;
        //Прямоугольник, ограничивающий спрайт
        private Rectangle sprRectangle;
        //Координата спрайта
        private Vector2 sprPosition;
        //Границы экрана
        private Rectangle scrBounds;
        //Направление движения спрайта
        private Vector2 sprMove = new Vector2(0, 0);
        public spriteComp(Game game, ref Texture2D newTexture,
            Rectangle newRectangle, Vector2 newPosition
)
            : base(game)
        {
            sprTexture = newTexture;
            sprRectangle = newRectangle;
            sprPosition = newPosition;
            //Работаем в портретном режиме, высота - 480, ширина - 800
            scrBounds = new Rectangle(0, 0,
                game.Window.ClientBounds.Height,
                game.Window.ClientBounds.Width
                );
        }

        /// <summary>
        /// Позволяет игровому компоненту выполнить необходимую инициализацию перед\r\запуском. 
         Здесь можно запросить нужные службы и загрузить контент.
        /// 
        /// </summary>
        public override void Initialize()
        {
            // ЗАДАЧА: добавьте здесь код инициализации

            base.Initialize();
        }

        /// <summary>
        /// Позволяет игровому компоненту обновиться.
        /// </summary>
        /// <param name="gameTime">Предоставляет моментальный снимок значений времени.</param>
        public override void Update(GameTime gameTime)
        {
            //Изменение координат в соответствии с данными, имеющимися в sprMove
            sprPosition += sprMove;
            //Если вышли за пределы экрана - исправляем
            if (sprPosition.X < scrBounds.Left)
            {
                sprPosition.X = scrBounds.Left;
            }
            if (sprPosition.X > scrBounds.Width - sprRectangle.Width)
            {
                sprPosition.X = scrBounds.Width - sprRectangle.Width;
            }
            if (sprPosition.Y < scrBounds.Top)
            {
                sprPosition.Y = scrBounds.Top;
            }
            if (sprPosition.Y > scrBounds.Height - sprRectangle.Height)
            {
                sprPosition.Y = scrBounds.Height - sprRectangle.Height;
            }

            base.Update(gameTime);
        }
        public override void Draw(GameTime gameTime)
        {
            SpriteBatch sprBatch =
                (SpriteBatch)Game.Services.GetService(typeof(SpriteBatch));

            sprBatch.Draw(sprTexture, sprPosition, sprRectangle, Color.White);

            base.Draw(gameTime);
        }
        //Метод для установки направления движения спрайта
        public void Move(Vector2 move)
        {
            //Зададим скорость и направление движени спрайта
             sprMove = move;
            //Выведем данные для целей отладки
            Debug.WriteLine(move.ToString());
        }
        //Получение позиции спрайта для внешних целей
        public Vector2 GetSprPos()
        {
            return sprPosition;
        }
        //Получение прямоугольника, ограничивающего спрайт, для врешних целей
        public Rectangle GetSprRectangle()
        {
            return sprRectangle;
        }
    }
}
Листинг 13.2. Код игрового компонента

В целом этот код уже вам знаком по предыдущим примерам. Опишем его ключевые особенности. Метод Move принимает параметр move, который записывается в переменную sprMove.

В методе компонента Update эта переменная используется для модификации позиции спрайта. После модификации производится контроль на пересечение спрайтом границ экрана. В компоненте мы подключили пространство имён System.Diagnostics, в методе Move мы выводим в окно отладочных сообщений переданный в объект параметр move, на рис. 13.3 вы можете видеть это окно.

Отладочные сообщения

увеличить изображение
Рис. 13.3. Отладочные сообщения

Отладочные сообщения – очень ценный инструмент для исследования программ, не следует забывать о нём при разработке игр.

Гулич Анна
Гулич Анна
Невозможно пройти тесты, в окне с вопросами пусто
Сашечка Огнев
Сашечка Огнев
Россия, Красноярский край
Андрей Корягин
Андрей Корягин
Россия, Пенза, Вазерская средняя школа, 2001