0

我对使用精灵完全陌生。

我需要为游戏界面绘制不透明的精灵图层。这些绘图调用的方法在两个不同的类中定义:

public class ColorStreamRenderer : Object2D
{
    .
    .
    public override void Draw(GameTime gameTime)
    {
        .
        .
        this.Game.GraphicsDevice.Clear(Color.White);
        this.SharedSpriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.Additive);
        this.SharedSpriteBatch.Draw(this.backBuffer, new Rectangle(0, 0, 1280, 960), null, Color.White);
        this.SharedSpriteBatch.End();
        .
        .
    }

public class AvateeringXNA : Microsoft.Xna.Framework.Game
{
    .
    .
    protected override void Draw(GameTime gameTime)
    {
        .
        .
        private Texture2D recttex;
        .
        GraphicsDevice.Clear(Color.Black);
        spriteBatch.Begin(SpriteSortMode.Texture, BlendState.Opaque);
        this.recttex = Content.Load<Texture2D>("doodle");
        spriteBatch.Begin(SpriteSortMode.Texture, BlendState.Opaque);
        spriteBatch.Draw(recttex, rightMenu[ID], Color.White);
        spriteBatch.End();             
        .
        .
    }

rightMenu[ID]Microsoft.Xna.Framework.Rectangle位于输出显示窗口内的一个。

这两个类已经各自继承了一个类,由于C#不允许多重继承,所以我不能Content.LoadColorStreamRenderer类中使用。所以精灵需要在不同的类中绘制。

现在,问题是,我无法控制精灵的深度。无论我传递什么参数,类的精灵AvateeringXNA总是落后于类的精灵ColorStreamRenderer。通过调整屏幕上的混合选项,我知道这些实际上是在屏幕上绘制的,因为后面的图层是部分可见的。

我已经尝试了 and 的所有重载SharedSpriteBatch.BeginSharedSpriteBatch.Draw但它们都不起作用。layerDepth即使通过参数显式定义深度for SharedSpriteBatch.DrawandspriteBatch.Draw也不起作用。

4

1 回答 1

1

我不会解开你的代码,而是给你我认为你需要解决这个问题的信息:

首先:( SpriteBatch立即模式除外)在End调用中完成所有绘图。它将所有绘图排队,以便可以将精灵分批提交给 GPU (以提高性能)。如果您使用它的内置排序,它只会对当前队列中的精灵进行排序(在开始和结束之间)。

如果可能的话,最好只为整个帧使用一个开始/结束块,并且Draw()首先将所有内容都按从后到前的顺序。但这不是要求。

一个巧妙的技巧是像对待SpriteBatch要渲染的精灵列表一样对待。一次填充多个,然后End以所需的渲染顺序调用它们。(如果您的对象的逻辑顺序与所需的渲染顺序不匹配,则很方便。)

默认情况下,您获得的唯一深度排序SpriteBatch是使用其排序模式。但如果您使用DepthStencilState.Default. 不过,我不会推荐它。设置精灵 Z 位置的参数(在 0 和 1 之间有效)layerDepthDraw

第二: Content只是Game类型的属性ContentManager。您可以获取该ContentManager对象并将其传递给不同的类并从它们中加载内容。

于 2013-06-28T11:38:36.450 回答