题
在 DirectX 中,可以将 D3DXSPRITE 参数设置为两者的组合:
D3DXSPRITE_SORT_DEPTH_BACKTOFRONT
和
D3DXSPRITE_SORT_TEXTURE
这意味着精灵首先按其图层深度排序,然后再按它们所在的纹理排序。我正在尝试在 XNA 中做同样的事情,但遇到了一些问题。我试过了:
SpriteBtch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.BackToFront & SpriteSortMode.Texture, SaveStateMode.None);
但它不起作用,似乎只是在纹理排序中执行它们,忽略纹理层深度。难道我做错了什么!?或者说根本不可能?
其他提示
一个可能的解决方案:
定义一个代表要绘制的精灵的新对象
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.
}
}
然后添加一个“要绘制的精灵”列表,您可以:
- 按绘图优先级排序,倒序排列,因此 Priority == 1 优先
- 当 a.Priority == b.Priority 时按纹理排序(这是棘手的部分,但并不难)
例如,在您的主课程中,您将拥有:
private List<Sprite> spritesToDrawThisTick = new List<Sprite>();
每一次勾选,您:
- 添加精灵进行绘制
- 执行排序逻辑
- 使用 SpriteSortMode.Immediate 调用 SpriteBatch.Begin
- 在列表中执行 foreach 来调用每个 Sprite 的 Draw 方法
- 重要的:清空你的 spritesToDrawThisTick 列表
不隶属于 StackOverflow