0

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

D3DXSPRITE_SORT_DEPTH_BACKTOFRONT

D3DXSPRITE_SORT_TEXTURE

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

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

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

4

2 回答 2

1

SpriteSortMode是一个枚举,应该使用 | 操作员:

SpriteSortMode.BackToFront | SpriteSortMode.Texture

更新:正如本文提到的,您的场景在 XNA 中是不可能的:

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

于 2009-10-01T12:23:13.430 回答
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.
    }
}

然后添加一个“要绘制的精灵”列表:

  1. 按绘制优先级排序,倒序所以 Priority == 1 优先
  2. 当 a.Priority == b.Priority 时按纹理排序(这是棘手的部分,但并不难)

因此,例如在您的 Main 类中,您将拥有:

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

每滴答声,你:

  1. 添加精灵进行绘制
  2. 执行排序逻辑
  3. 使用 SpriteSortMode.Immediate 调用您的 SpriteBatch.Begin
  4. 在你的列表上做一个 foreach 来调用每个 Sprite 的 Draw 方法
  5. 重要:清空你的 spritesToDrawThisTick 列表
于 2009-10-01T16:36:30.090 回答