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