在 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. 按绘图优先级排序,倒序排列,因此 Priority == 1 优先
  2. 当 a.Priority == b.Priority 时按纹理排序(这是棘手的部分,但并不难)

例如,在您的主课程中,您将拥有:

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

每一次勾选,您:

  1. 添加精灵进行绘制
  2. 执行排序逻辑
  3. 使用 SpriteSortMode.Immediate 调用 SpriteBatch.Begin
  4. 在列表中执行 foreach 来调用每个 Sprite 的 Draw 方法
  5. 重要的:清空你的 spritesToDrawThisTick 列表
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top