定义两个SpriteSortModes?

时间:2009-10-01 10:47:10

标签: xna sprite

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

D3DXSPRITE_SORT_DEPTH_BACKTOFRONT

D3DXSPRITE_SORT_TEXTURE

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

SpriteBtch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.BackToFront & SpriteSortMode.Texture, SaveStateMode.None);

但它不起作用,似乎只是在纹理排序中执行它们,忽略纹理图层深度。难道我做错了什么!?或者甚至不可能?

2 个答案:

答案 0 :(得分:1)

SpriteSortMode是枚举,应使用|组合操作者:

SpriteSortMode.BackToFront | SpriteSortMode.Texture

更新:,如this article所述,XNA无法实现您的方案:

  

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

答案 1 :(得分:1)

可能的解决方案:

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

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.
    }
}

然后添加一个“sprite to draw”列表:

  1. 按优先顺序排序,反向排序,因此优先级= = 1是第一个
  2. a.Priority == b.Priority时按纹理排序(这是棘手的部分但不是很难)
  3. 因此,在您的Main类中,您将拥有:

    private List<Sprite> spritesToDrawThisTick = new List<Sprite>();
    

    每次打勾,你:

    1. 添加精灵来绘制
    2. 执行排序逻辑
    3. 使用SpriteSortMode.Immediate
    4. 调用SpriteBatch.Begin
    5. 在列表中执行foreach以调用每个Sprite的Draw方法
    6. important:清空你的spritesToDrawThisTick列表