Спонсор: Microsoft
Опубликован: 10.04.2009 | Доступ: свободный | Студентов: 3208 / 229 | Оценка: 4.49 / 4.39 | Длительность: 17:21:00
Специальности: Программист
Самостоятельная работа 3:

Устройства ввода, перемещение объектов

Аннотация: В этой лабораторной работе мы ознакомимся с основными способами работы с устройствами ввода. В частности, поговорим о перемещении объектов, обсудим работу с различными устройствами ввода и вопросы автоматического перемещения объектов.

Примеры к лабораторной работе

Задачи работы

  • Научиться получать данные о состоянии мыши и клавиатуры
  • Научиться перемещать игровые объекты в соответствии с параметрами, полученными от устройства ввода
  • Научиться перемещать игровые объекты в автоматическом режиме, используя средства игрового цикла
  • Научиться организовывать управление несколькими объектами для применения в играх, в которые могут играть два игрока, пользующиеся одним компьютером
  • Научиться узнавать и изменять размеры игрового окна
  • Научиться переводить программу в полноэкранный режим, настраивать разрешение экрана при работе в таком режиме
  • Научиться предотвращать пересечение объектом границ экрана при перемещении объекта

Обработка состояния клавиатуры

Создадим новый стандартный проект, назовем его P3_1. Добавим в проект изображение, переменные для хранения текстуры и позиции изображения в игровом окне, загрузим его в методе LoadContent. Вот, как выглядит текст программы после модификации (листинг 7.1.).

using System;
using System.Collections.Generic;
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.Net;
using Microsoft.Xna.Framework.Storage;

namespace P3_1
{
    /// <summary>
    /// This is the main type for your game
    /// </summary>
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        private Texture2D MySprite;
        private Vector2 position = new Vector2(150, 200);

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }

    
        protected override void Initialize()
        {
            // TODO: Add your initialization logic here

            base.Initialize();
        }

        
        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
            MySprite = Content.Load<Texture2D>("ball");
        }

        protected override void UnloadContent()
        {
            // TODO: Unload any non ContentManager content here
        }

        
        protected override void Update(GameTime gameTime)
        {
            // Allows the game to exit
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();

            // TODO: Add your update logic here

            base.Update(gameTime);
        }

        
        protected override void Draw(GameTime gameTime)
        {
            graphics.GraphicsDevice.Clear(Color.CornflowerBlue);

            spriteBatch.Begin();
            spriteBatch.Draw(MySprite, position, Color.White);
            spriteBatch.End();

            // TODO: Add your drawing code here

            base.Draw(gameTime);
        }
    }
}
Листинг 7.1. Код класса Game1

Теперь добавим в метод Update код, который будет изменять позицию выведенного спрайта в соответствии с изменением состояния клавиатуры. В частности, будет реагировать на клавиши-стрелки, перемещая объект в соответствующем направлении. На рис. 7.1. вы можете видеть внешний вид игрового окна

Игровое окно

увеличить изображение
Рис. 7.1. Игровое окно

Для того, чтобы настроить перемещение спрайта по клавиатурным командам, нам понадобится такой код (листинг 7.2.).

KeyboardState kbState = Keyboard.GetState();
            if (kbState.IsKeyDown(Keys.Up))
                position.Y -= 1;
            if (kbState.IsKeyDown(Keys.Down))
                position.Y += 1;
            if (kbState.IsKeyDown(Keys.Left))
                position.X -= 1;
            if (kbState.IsKeyDown(Keys.Right))
                position.X += 1;
Листинг 7.2. Код, реализующий чтение состояния клавиатуры и перемещение спрайта

Здесь мы сначала создали переменную kbState типа KeyboardState, в которую записали текущее состояние клавиатуры, вызвав метод GetState() объекта KeyBoard. Этот метод возвращает состояние клавиатуры.

После этого мы проверили, с помощью метода IsKeyDown, была ли нажата клавиша-стрелка "Вверх". Наименования клавиш хранятся в перечислении Keys. В нашем случае клавиша-стрелка "вверх" символизируется именем Keys.Up. Если клавиша нажата – изменим координату Y позиции объекта, вычтя из нее 1. Позиция изменится и при следующем выводе спрайта он переместится на 1 пиксель вверх. Точно так же обрабатываются другие клавиши-стрелки. Keys.Down – это клавиша "вниз", если она нажата, к координате Y прибавляется единица и объект перемещается вниз. Keys.Left – это клавиша "влево" - объект перемещается влево – от его координаты X отнимается единица. Keys.Right – это клавиша "вправо" - объект перемещается вправо, к его координате X прибавляется 1.

Если нажать и удерживать одну из клавиш – объект будет непрерывно перемещаться в указанном направлении. Если, не отпуская нажатую клавишу, нажать другую, объект изменит направление или остановится. Например, нажав одновременно клавиши "вверх" и"влево", мы заставим объект двигаться по диагонали влево и вверх. А если в то время, как нажата клавиша "вверх" мы нажмем и клавишу "вниз" - объект остановится – нажатие "вверх" вычитает единицу из его позиции, нажатие "вниз" - прибавляет единицу, в результате объект оказывается неподвижным.

С помощью метода IsKeyUp объекта kbState мы проводим проверку, обратную методу IsKeyDown – то есть этот метод возвращает True, если клавиша не нажата, и False – если нажата.

Для перемещения объекта мы модифицируем его координаты на игровом поле. Можно заметить, что модификация ведется с шагом в 1. Это значение можно назвать скоростью перемещения объекта. Увеличив шаг изменения координаты по нажатию клавиши, можно увеличить скорость перемещения.

Можно заметить, что описанный подход к перемещению объекта по клавиатурным командам работает, однако если сложность игровой программы увеличится – он оказывается неудобным. Поэтому ниже мы рассмотрим пример использование управляемого с клавиатуры игрового компонента, унаследованного от DrawableGameComponent. Такой подход делает удобным не только клавиатурное управление, но и автоматическое управление объектом, делает возможным удобное применение ограничений на управление объектом, обработку столкновений объектов (этот вопрос будет рассмотрен на следующем занятии) и другие задачи. Однако, стоит отметить, что принципы управления объектами с клавиатуры даже при управлении игровым компонентом, сохраняются.

Теперь рассмотрим управление игровым объектом с помощью мыши.

Alina Lasskaja
Alina Lasskaja

Быть может кто-то из Вас знает игру Sims, к какому жанру она относиться? Жизненная симуляция, ролевая игра, там можно и дома строить.....