Работа со спрайтами

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

В прошлой теме мы рассмотрели, как отрисовать спрайт в окне. Теперь же посмотрим на некоторые дополнительные возможности по отрисовке, которые нам предлагает MonoGame.

Положение спрайта

В прошлой теме при отрисовке спрайта мы использовали координаты, задаваемые вектором Vector2.Zero, то есть нулевые координаты в левом верхнем углу. Но естественно мы можем использовать и любые другие координаты, которые вписываются в окно приложения.

Для установки положения используется класс Vector2 или двухмерный вектор. Одна из версий конструктора класса выглядит так: Vector2(float x, float y). Таким образом, мы можем указать x - и y-координату в виде объектов float.

Теперь изменим код приложения:

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;

        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)
        {
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape))
                Exit();
			base.Update(gameTime);
        }

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

            spriteBatch.Begin();
            spriteBatch.Draw(texture, new Vector2(60, 50), Color.White);
            spriteBatch.End();
            base.Draw(gameTime);
        }
    }
}
Vector2 in MonoGame

Здесь для размещения спрайта устанавливается точка с координатами x=60 и y=50.

Однако может возникнуть вопрос, а как узнать предельно допустимые координаты? Границы окна приложения описываются свойством Window.ClientBounds, высота окна - Window.ClientBounds.Height, ширина окна - Window.ClientBounds.Width. И если, например, мы хотим позиционировать спрайт примерно по центру, то можно задать следующий вектор:

new Vector2((Window.ClientBounds.Width / 2),Window.ClientBounds.Height/2))

Также мы можем использовать размеры текстуры при размещении. Для этого в классе Texture2D определены свойства Width и Height. Например, для более точного позиционирования по центру мы можем использовать следующий вектор:

new Vector2(
    (Window.ClientBounds.Width / 2) - (texture.Width / 2),
    (Window.ClientBounds.Height/2) - (texture.Height/2))

Третий параметр в использованной выше версии метода Draw() означает цвет подсветки спрайта. Например, используем синий цвет:

spriteBatch.Draw(texture, new Vector2(
        (Window.ClientBounds.Width / 2) - (texture.Width / 2),
        (Window.ClientBounds.Height/2) - (texture.Height/2)), Color.Blue);

Метод Draw() имеет еще ряд перегруженных версий. Рассмотрим одну из них:

spriteBatch.Draw(texture, 
            new Vector2(
                (Window.ClientBounds.Width / 2) - (texture.Width / 2),
                (Window.ClientBounds.Height/2) - (texture.Height/2)), 
            null,
            Color.White,
            0,
            Vector2.Zero,
            0.8f,
            SpriteEffects.FlipVertically,
            0);

Рассмотрим все параметры по порядку:

  • texture: рисуемая текстура Texture2D

  • position: координаты верхнего левого угла текстуры, которые задаются объектом Vector2

  • sourceRectangle: объект Rectangle, который указывает на прямоугольную область текстуры, которую надо отрисовать. В данном случае мы рисуем всю текстуру, поэтому указываем значение null

  • color: цвет подсветки

  • rotation: задает угол вращения изображения в виде значения float. Здесь равен 0, поэтому вращения не происходит

  • origin: указывает на центр вращения, задается объектом Vector2. В качестве центра вращения здесь применяются нулевые координаты - Vector2.Zero

  • scale: коэффициент масштабирования, задаваемый значением float. В данном случае коэффициент меньше единицы (0.8f), поэтому текстура уменьшает размеры в 0.8 раз

  • effects: значение из перечисления SpriteEffects, позволяющее отразить текстуру по горизонтали (SpriteEffects.FlipHorizontally) или по вертикали (SpriteEffects.FlipVertically). В данном случае отражаем изображение по вертикали

  • layerDepth: указывает на глубину наложения (аналог z-index в css) относительно других изображений.

Теперь используем параметр sourceRectangle:

spriteBatch.Begin();
spriteBatch.Draw(texture, 
			new Vector2(
				(Window.ClientBounds.Width / 2) - (texture.Width / 2),
                (Window.ClientBounds.Height/2) - (texture.Height/2)), 
            new Rectangle(0, 0, (texture.Width / 2), (texture.Height / 2)),
            Color.White);
spriteBatch.End();

В данном случае использовалась следующая версия конструктора Rectangle: Rectangle(int x, int y, int width, int height). Она задает координаты x и y на текстуре, начиная с которых надо сделать вырезку изображения. И параметры width и height задают ширину и высоту вырезки, начиная с x и y. То есть в данном случае мы увидим четверть изображения:

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