Xna 定义两种SpriteSortMode?

Xna 定义两种SpriteSortMode?,xna,sprite,Xna,Sprite,在DirectX中,可以将D3DXSPRITE参数设置为以下两种参数的组合: D3DXSPRITE_SORT_DEPTH_BACKTOFRONT 和 D3DXSPRITE_SORT_TEXTURE 这意味着精灵首先按其层深度排序,然后按其所在的纹理排序。我正试图在XNA做同样的事情,我遇到了一些问题。我试过: SpriteBtch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.BackToFront & SpriteSortMode

在DirectX中,可以将D3DXSPRITE参数设置为以下两种参数的组合:

D3DXSPRITE_SORT_DEPTH_BACKTOFRONT

D3DXSPRITE_SORT_TEXTURE
这意味着精灵首先按其层深度排序,然后按其所在的纹理排序。我正试图在XNA做同样的事情,我遇到了一些问题。我试过:

SpriteBtch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.BackToFront & SpriteSortMode.Texture, SaveStateMode.None);
但它不起作用,似乎只是在纹理排序中进行,忽略了纹理层深度。我做错什么了吗!?或者甚至不可能?

是一个枚举,应该使用|运算符组合:

SpriteSortMode.BackToFront | SpriteSortMode.Texture
更新:如前所述,您的场景在XNA中不可能:

按深度排序和按深度排序 纹理是相互排斥的

一种可能的解决办法:

定义表示要绘制的精灵的新对象

class Sprite
{
    public float Priority { get; set; }      // [0..1]
    public String TextureName { get; set; }

    public void Draw(SpriteBatch spriteBatch)
    {
        spriteBatch.Draw(TextureName, ..., Priority); // here Priority is useless because of the sort mode.
    }
}
然后添加一个“要绘制的精灵”列表,您可以:

  • 按绘图优先级排序,顺序相反,因此优先级==1为第一位
  • 当a.Priority==b.Priority时按纹理排序(这是棘手的部分,但不是那么难)
  • 例如,在您的主课中,您将有:

    private List<Sprite> spritesToDrawThisTick = new List<Sprite>();
    
    private List spritesToDrawThisTick=new List();
    
    每一个滴答声,你:

  • 添加精灵以进行绘制
  • 执行排序逻辑
  • 调用您的SpriteBatch。开始使用SpriteSortMode。立即
  • 在你的列表上做一个foreach调用每个精灵的Draw方法
  • 重要提示:清空spritesToDrawThisTick列表

  • 谢谢,但那真的,真的是垃圾,因为这是DirectX可以做和确实做的事情,而xna不能(好主意,我想我会更详细地研究它。“简单”的解决方案似乎就是按顺序绘制精灵,并尽可能多地在代码中对它们进行批处理。虽然有些笨拙,但确实可行。