Проблема в том, что у вас есть несколько пакетов, определенных как код между spriteBatch.Begin()
и spriteBatch.End()
.
По умолчанию spriteBatch.Begin()
вызывается без параметров, все спрайты отрисовываются в порядке их вызова: первый вызов отрисовки является фоновым. Второй розыгрыш будет поверх первого ...
Как сказал @ProfessionalKent в своем ответе, используйте параметр layerDepth
:
spriteBatch.Draw(Texture, destinationRectangle, sourceRectangle, Color.White, 0.0f, Vector2.Zero, SpriteEffects.None, layerDepth);
layerDepth принимает любое значение float
(по умолчанию 0), Нижние значения отображаются поверх более высоких значений . Все идентичные значения выполняются в указанном порядке.
Этот параметр также относится к spriteBatch.DrawString()
Однако layerDepth
действителен только в пределах одного и того же пакета. После вызова End()
пакет сортируется, выравнивается и отображается в буфере кадров.
Решение
Запишите необходимую глубину для всех нарисованных объектов. Замените числа layerDepth
в следующем коде, чтобы отразить ваш анализ.
Удалите все строки spriteBatch.Begin()
и spriteBatch.End()
во всем проекте. Если spriteBatch.Begin()
не имеет по умолчанию (строки 81 и 91-100) параметров.
В Game1.cs
открыть spriteBatch как можно раньше после GraphicsDevice.Clear
:
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin();
// Your existing code here.
spriteBatch.End();
//oprozniony, nothing should be here
}
В GameScene.cs:
private void DrawGame()
{
// The ,, is for the null source rectangle,
spriteBatch.Draw(floor1, rec_floor1,, color1, 0.0f, Vector2.Zero, SpriteEffects.None, 2);
spriteBatch.Draw(floor2, rec_floor2,, color1, 0.0f, Vector2.Zero, SpriteEffects.None, 3);
spriteBatch.Draw(house1, rec_house1,,color1, 0.0f, Vector2.Zero, SpriteEffects.None, 1);
// example of a table the animatedSprite(at a depth of 0) will walk or move behind(note the negative depth):
// spriteBatch.Draw(stol, rec_stol, , color1, 0.0f , Vector2.Zero, SpriteEffects.None, -1);
}
In AnimatedSprite.cs
public void Draw(SpriteBatch spriteBatch, Vector2 location)
{
// unless the width and height can change when the game is running, they should be class variables set in the constructor
int width = Texture.Width / Columns;
int height = Texture.Height / Rows;
// removed unnecessary casts:(unless currentFrame is not an int)
int row = currentFrame / Columns;
int column = currentFrame % Columns;
Rectangle sourceRectangle = new Rectangle(width * column, height * row, width, height);
Rectangle destinationRectangle = new Rectangle((int)location.X, (int)location.Y, 120, 140);
if (Game1.przelacznik_w_bezruchu == true) sourceRectangle = new Rectangle(0, 0, width, height);
// Place the sprite at Depth of 0.
spriteBatch.Draw(Texture, destinationRectangle, sourceRectangle, Color.White, 0.0f, Vector2.Zero, SpriteEffects.None, 0);
}
Есть ситуации, которые требуют нескольких партий. Если это так, разделите партии по порядку глубины вручную.