Pergunta
Em DirectX é possível definir os parâmetros D3DXSPRITE ser uma combinação de ambos:
D3DXSPRITE_SORT_DEPTH_BACKTOFRONT
e
D3DXSPRITE_SORT_TEXTURE
O que significa que sprites são classificadas pela primeira vez por sua profundidade da camada e, em seguida, em segundo lugar pela textura que eles estão. Eu estou tentando fazer o mesmo em XNA e eu estou tendo alguns problemas. Eu tentei:
SpriteBtch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.BackToFront & SpriteSortMode.Texture, SaveStateMode.None);
Mas ele não funciona e apenas parece fazê-las em textura ordenação, ignorando a profundidade da camada de texturas. Estou fazendo algo errado!? Ou não é mesmo possível?
Solução
SpriteSortMode é um enum e deve ser combinada com o | operador:
SpriteSortMode.BackToFront | SpriteSortMode.Texture
Update: como este artigo menciona, o cenário não é possível em XNA:
ordenação pela profundidade e classificação por textura são mutuamente exclusivas
Outras dicas
Uma possível solução:
Defina um novo objeto representando um sprite para desenhar
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.
}
}
Em seguida, adicione um "sprites para desenhar" lista que você:
- Ordenar por desenho prioridade, a ordem inversa de modo Prioridade == 1 é a primeira
- Ordenar pela textura quando a.Priority == b.Priority (esta é a parte difícil, mas não é tão difícil)
Assim, em sua classe principal, por exemplo, você vai ter:
private List<Sprite> spritesToDrawThisTick = new List<Sprite>();
E cada carrapato, você:
- Adicionar sprites para desenhar
- Faça a lógica de classificação
- Ligue para o seu SpriteBatch.Begin usando SpriteSortMode.Immediate
- Faça um foreach em sua lista para chamar de cada Sprite método Draw
- importante: esvaziar a lista spritesToDrawThisTick