Невозможно пройти тесты, в окне с вопросами пусто |
Опубликован: 14.08.2012 | Уровень: специалист | Доступ: платный
Самостоятельная работа 5:
Основы обработки сенсорного ввода, перемещение объектов
11.2. Автоматическое перемещение объекта к точке касания
В этом примере мы реализуем автоматическое пошаговое перемещение объекта к точке касания. Создадим стантартный игровой XNA-проект, назовем его P5_2, его код приведен в листинге 11.3.
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.Input.Touch; using Microsoft.Xna.Framework.Media; namespace P5_2 { /// <summary> /// Это главный тип игры /// </summary> public class Game1 : Microsoft.Xna.Framework.Game { GraphicsDeviceManager graphics; SpriteBatch spriteBatch; private Texture2D mySprite; private Vector2 position = new Vector2(150, 200); private Vector2 newPosition = new Vector2(); private bool isTouched = false; 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() { // ЗАДАЧА: добавьте здесь логику инициализации base.Initialize(); } /// <summary> /// LoadContent будет вызываться в игре один раз; здесь загружается /// весь контент. /// </summary> protected override void LoadContent() { // Создайте новый SpriteBatch, который можно использовать для отрисовки текстур. spriteBatch = new SpriteBatch(GraphicsDevice); mySprite = Content.Load<Texture2D>("ball"); // ЗАДАЧА: используйте здесь this.Content для загрузки контента игры } /// <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(); //Получаем коллекцию объектов, содержащих информацию о касаниях экрана TouchCollection touchLocations = TouchPanel.GetState(); //Перебираем коллекцию, присваивая объекту координаты касания foreach (TouchLocation touchLocation in touchLocations) { if (touchLocation.State == TouchLocationState.Pressed) { newPosition = touchLocation.Position; isTouched = true; } } if (isTouched) { if (newPosition.X - position.X > 0) { position.X += 1; } else { if (newPosition.X != position.X) { position.X -=1; } } if (newPosition.Y - position.Y > 0) { position.Y += 1; } else { if (newPosition.Y != position.Y) { position.Y -= 1; } } if (position == newPosition) { isTouched = false; } } base.Update(gameTime); } /// <summary> /// Вызывается, когда игра отрисовывается. /// </summary> /// <param name="gameTime">Предоставляет моментальный снимок значений времени.</param> protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); spriteBatch.Begin(); spriteBatch.Draw(mySprite, position, Color.White); spriteBatch.End(); base.Draw(gameTime); } } }Листинг 11.3. Код класса Game1
В этом коде (результат его работы представлен на рис. 11.2) мы применяем следующий прием. Когда пользователь коснулся экрана, мы, во-первых, запоминаем в переменной newPosition координату касания, во-вторых, устанавливаем логическую переменную isTouched в значение true. Если эта переменная истинна (что и происходит после касания, и до тех пор, пока координаты спрайта (его левого верхнего угла) не совпадут с координатами касания), выполняется пошаговое, с шагом 1, перемещение спрайта к точке касания.