C# 如何从具有所需深度的不同类调用sprite layer draw方法?

C# 如何从具有所需深度的不同类调用sprite layer draw方法?,c#,xna,sprite,kinect,layer,C#,Xna,Sprite,Kinect,Layer,我对和精灵一起工作是完全陌生的 我需要为游戏界面绘制不透明的精灵层。这些绘制调用的方法在两个不同的类中定义: public class ColorStreamRenderer : Object2D { . . public override void Draw(GameTime gameTime) { . . this.Game.GraphicsDevice.Clear(Color.White); t

我对和精灵一起工作是完全陌生的

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

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();
        .
        .
    }

公共类AvateeringXNA:Microsoft.Xna.Framework.Game
{
.
.
受保护覆盖无效绘制(游戏时间游戏时间)
{
.
.
私有纹理2d-recttex;
.
图形设备。清晰(颜色。黑色);
spriteBatch.Begin(SpriteSortMode.Texture,BlendState.不透明);
this.recttex=Content.Load(“涂鸦”);
spriteBatch.Begin(SpriteSortMode.Texture,BlendState.不透明);
spriteBatch.Draw(recttex,rightMenu[ID],Color.White);
spriteBatch.End();
.
.
}
rightMenu[ID]
是一个位于输出显示窗口中的
Microsoft.Xna.Framework.Rectangle

这两个类已经分别继承了一个类,而且由于C#不允许多重继承,我不能使用
内容。在
ColorStreamRenderer
类中加载
。因此需要在不同的类中绘制精灵

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


我已经尝试了
SharedSpriteBatch.Begin
SharedSpriteBatch.Draw
的所有重载,但都不起作用。即使通过
layerDepth
参数为
SharedSpriteBatch.Draw
spriteBatch.Draw
明确定义深度,也不起作用。

我给你的不是解开你的代码我认为您需要解决此问题的信息:

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

如果可能的话,最好只为整个帧使用一个开始/结束块,然后从后到前依次使用
Draw()

一个巧妙的技巧是将
SpriteBatch
视为要渲染的精灵列表。一次填充多个精灵,然后按所需的渲染顺序对其调用
End
。(如果对象的逻辑顺序与所需的渲染顺序不匹配,则可以使用此方法。)

默认情况下,使用
SpriteBatch
获得的唯一深度排序是使用其排序模式。但如果使用
DepthStencilState,它可以使用深度缓冲区(如3D图形)。默认值为
。不过,我不推荐使用它。
layerDepth
参数设置sprite的Z位置(在0和1之间有效)


第二:
内容
只是
游戏
类型的
内容管理器
的一个属性。你可以将
内容管理器
对象传递到不同的类中,并从中加载内容。

非常感谢Andrew!这解决了我的问题。我从未意识到
游戏
可以传递分为多个类。不客气:)我的意思是传递
内容
本身-但是,是的,绝对可以,如果这对你的代码更有效的话,你也可以传递
游戏
类。它们都是引用类型-所以你只是给它们一个引用。
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();             
        .
        .
    }