2009-10-01 12 views
0

Dans DirectX, il est possible de définir les paramètres de D3DXSPRITE être une combinaison des deux:Définition de deux SpriteSortModes?

D3DXSPRITE_SORT_DEPTH_BACKTOFRONT 

et

D3DXSPRITE_SORT_TEXTURE 

Ce qui signifie que les sprites sont d'abord triées par leur profondeur de la couche, puis d'autre part par la texture sur laquelle ils sont. J'essaie de faire la même chose avec XNA et j'ai quelques problèmes. J'ai essayé:

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

Mais il ne fonctionne pas et semble juste pour les faire dans l'ordre de texture, ignorant les textures profondeur de la couche. Est-ce que je fais quelque chose de mal!? Ou n'est-ce pas même possible?

Répondre

1

SpriteSortMode est une énumération qui doit être combinée en utilisant le | opérateur:

SpriteSortMode.BackToFront | SpriteSortMode.Texture 

Mise à jour: comme this article mentionne, votre scénario est impossible dans XNA:

le tri par la profondeur et le tri par texture sont mutuellement exclusifs

+0

Merci, mais c'est vraiment, vraiment de la foutaise alors, parce que c'est quelque chose que DirectX peut faire et fait, que xna ne peut pas! :( – Siyfion

1

Un possible solution:

Définir un nouveau représentant d'objet sprite ga dessiner

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. 
    } 
} 

ajouter ensuite un "sprites pour dessiner" la liste que vous:

  1. Trier par priorité dessin, l'ordre inverse si == Priorité 1 est d'abord
  2. Trier par texture lorsque a.Priority == b.Priority (ce qui est la partie la plus délicate, mais pas difficile)

donc, dans votre classe principale par exemple, vous aurez:

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

Et chaque tick, vous:

  1. Ajouter sprites pour dessiner
  2. Est-ce que la logique de tri
  3. Appelez votre SpriteBatch.Begin en utilisant SpriteSortMode.Immediate
  4. Faites un foreach sur votre liste appelez chaque méthode de tirage des sprites
  5. important: videz vos spritesToDrawCette listeTick
+0

Bonne idée, j'y reviendrai plus en détail, la solution "facile" semble être de simplement dessiner les sprites dans l'ordre et d'essayer de les enchaîner dans le code autant que possible. capable. – Siyfion