这是一个层排序的例子:
public enum TextureName : byte
{
Black,
Yellow
}
private GraphicsDeviceManager graphics;
private SpriteBatch spriteBatch;
public struct Sprite
{
public Vector2 Position;
public Texture2D Texture;
public Sprite(Texture2D texture, Vector2 position)
{
Position = position;
Texture = texture;
}
}
public Dictionary<TextureName, Sprite> Sprites { get; private set; }
protected override void LoadContent()
{
spriteBatch = new SpriteBatch(GraphicsDevice);
Sprites = new Dictionary<TextureName, Sprite>();
Vector2 position = new Vector2(graphics.PreferredBackBufferWidth / 2 - 64, graphics.PreferredBackBufferHeight / 2 - 64);
Sprites.Add(TextureName.Black, new Sprite(Content.Load<Texture2D>(@"black_sprite"), position));
Sprites.Add(TextureName.Yellow, new Sprite(Content.Load<Texture2D>(@"yellow_sprite"), position + new Vector2(32, 32)));
}
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend);
spriteBatch.Draw(Sprites[TextureName.Black].Texture, Sprites[TextureName.Black].Position, null, Color.White, 0.0f, Vector2.Zero, 1.0f, SpriteEffects.None, 0);// -> will be drawn first
spriteBatch.Draw(Sprites[TextureName.Yellow].Texture, Sprites[TextureName.Yellow].Position, null, Color.White, 0.0f, Vector2.Zero, 1.0f, SpriteEffects.None, 0);// -> will be drawn second
spriteBatch.End();
base.Draw(gameTime);
}
所以黑色精灵会在后面。
您可以使用 SpriteBatch.Begin() 方法的 SpriteSortMode 并为 SpriteBatch.Draw() 方法设置图层深度,如下所示,轻松地重新排序您的 Sprite。
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.AlphaBlend);
spriteBatch.Draw(Sprites[TextureName.Black].Texture, Sprites[TextureName.Black].Position, null, Color.White, 0.0f, Vector2.Zero, 1.0f, SpriteEffects.None, 1.0f/* layer depth*/);
spriteBatch.Draw(Sprites[TextureName.Yellow].Texture, Sprites[TextureName.Yellow].Position, null, Color.White, 0.0f, Vector2.Zero, 1.0f, SpriteEffects.None, 0.0f/* layer depth*/);
spriteBatch.End();
base.Draw(gameTime);
}
输出将是:
如果您使用与其他类不同的精灵批次。第一个例子可以正常工作。只需注意将“YourClass.Draw()”按正确顺序放入主游戏绘制方法中即可。
注意使用第二个示例。它的工作速度比第一个慢得多。