В прошлой теме мы рассмотрели, как отрисовать спрайт в окне. Теперь же посмотрим на некоторые дополнительные возможности по отрисовке, которые нам предлагает 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); } } }
Здесь для размещения спрайта устанавливается точка с координатами 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. То есть в данном случае мы увидим четверть изображения: