В предыдущих темах рассматривалось автоматическое движение спрайта. Теперь добавим возможность управлять спрайтом с помощью клавиатуры.
Для взаимодействия с клавиатурой в 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;
Если нажата определенная клавиша, то происходит увеличение или уменьшение соответствующей координаты текущей позиции спрайта.