Обработка нажатий клавиатуры

Последнее обновление: 14.11.2015

В предыдущих темах рассматривалось автоматическое движение спрайта. Теперь добавим возможность управлять спрайтом с помощью клавиатуры.

Для взаимодействия с клавиатурой в MonoGame имеется класс Keyboard, который определен в пространстве имен Microsoft.Xna.Framework.Input.

Класс Keyboard определяет статический метод GetState(), который возвращает текущее состояние клавиатуры в виде объекта KeyboardState. Эта структура содержит три ключевых метода, которые позволяют нам определить, нажата ли определенная клавиша:

  • GetPressedKeys(): возвращает массив нажатых клавиш в виде объекта Key[]

  • IsKeyDown(Keys key): возвращает true, если нажата определенная клавиша, иначе возвращает false

  • IsKeyUp(Keys key): возвращает true, если была отпущена определенная клавиша

По умолчанию при создании проекта в коде уже задействуется этот класс - в методе Update:

protected override void Update(GameTime gameTime)
{
    if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape))
        Exit();

То есть если нажата клавиша Escape, то осуществляется выход из приложения.

Таким образом, нам надо в методе Update просто инспектировать состояние клавиатуры на нажатие клавиши, и если определенная клавиша нажата, то производить какие-либо действия, например, изменение координаты отрисовки спрайта.

Возьмем обычный какой-нибудь обычный спрайт и определим следующий код приложения:

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;

namespace Game1
{
    public class Game1 : Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        Texture2D texture;
        Vector2 position = Vector2.Zero;
        float speed = 5f;

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

        protected override void Initialize()
        {
            base.Initialize();
        }

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

        protected override void UnloadContent()
        {
            
        }

        protected override void Update(GameTime gameTime)
        {
            KeyboardState keyboardState = Keyboard.GetState();
			
			if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || keyboardState.IsKeyDown(Keys.Escape))
                Exit();
				
            if (keyboardState.IsKeyDown(Keys.Left))
                position.X -= speed;
            if (keyboardState.IsKeyDown(Keys.Right))
                position.X += speed;
            if (keyboardState.IsKeyDown(Keys.Up))
                position.Y -= speed;
            if (keyboardState.IsKeyDown(Keys.Down))
                position.Y += speed;

            base.Update(gameTime);
        }
        
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);

            spriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.AlphaBlend);

            spriteBatch.Draw(texture, position, Color.White);

            spriteBatch.End();
            base.Draw(gameTime);
        }
    }
}

Основную работу выполняет следующий участок кода:

if (keyboardState.IsKeyDown(Keys.Left))
    position.X -= speed;
if (keyboardState.IsKeyDown(Keys.Right))
    position.X += speed;
if (keyboardState.IsKeyDown(Keys.Up))
    position.Y -= speed;
if (keyboardState.IsKeyDown(Keys.Down))
    position.Y += speed;

Если нажата определенная клавиша, то происходит увеличение или уменьшение соответствующей координаты текущей позиции спрайта.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850