我正在xna上进行2D游戏。基本上我想在碰撞的另一个精灵上绘制一个矩形或精灵。我可以检测到碰撞和一切,但我不知道如何在精灵上画画。我正在精灵上绘制矩形,但它正在精灵后面绘制,这使得矩形不可见。我有办法实现这个目标吗?
答案 0 :(得分:0)
以下是图层排序的示例:
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轻松重新排序Sprite,并为SpriteBatch.Draw()方法设置图层深度,如下所示。
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()”按正确的顺序放入主游戏绘制方法中。
请注意使用第二个示例。它的工作速度比第一次慢得多。