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?

Foi útil?

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ê:

  1. Ordenar por desenho prioridade, a ordem inversa de modo Prioridade == 1 é a primeira
  2. 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ê:

  1. Adicionar sprites para desenhar
  2. Faça a lógica de classificação
  3. Ligue para o seu SpriteBatch.Begin usando SpriteSortMode.Immediate
  4. Faça um foreach em sua lista para chamar de cada Sprite método Draw
  5. importante: esvaziar a lista spritesToDrawThisTick
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top