如何在xna中的另一个精灵上绘制一个矩形或精灵?

时间:2014-03-07 00:37:53

标签: sprite xna-4.0 collision

我正在xna上进行2D游戏。基本上我想在碰撞的另一个精灵上绘制一个矩形或精灵。我可以检测到碰撞和一切,但我不知道如何在精灵上画画。我正在精灵上绘制矩形,但它正在精灵后面绘制,这使得矩形不可见。我有办法实现这个目标吗?

1 个答案:

答案 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);
    }

所以黑色精灵将落后。 First example

您可以使用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);
}

输出将是: enter image description here

如果您使用其他类的不同精灵批次。第一个例子可以正常工作。只需注意将“YourClass.Draw()”按正确的顺序放入主游戏绘制方法中。

请注意使用第二个示例。它的工作速度比第一次慢得多。