2011-01-02 5 views
0

Il peut être une question noob, mais voilà ...problème Superposition 2D Sprites (XNA)

J'utilise Visual Studio avec XNA Framework (3.1) et je vais seulement dessiner 2D sprites pour mon jeu, voici la méthode de tirage au sort dans la classe principale:

GraphicsDevice.Clear(Color.CornflowerBlue); 
      spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.None); 
      background.Draw(this.spriteBatch); 
      player1.Draw(this.spriteBatch); 
      player2.Draw(this.spriteBatch); 
      spriteBatch.End(); 
      base.Draw(gameTime); 

le problème est que le player2 est player1 chevauchement (parce qu'il est établi après), et je voudrais le plus faible du 2 les joueurs (par leur position) doivent être dessinés en dernier (pour simuler la profondeur).

Merci d'avance! (et désolé pour mon Engrish, je suis Français ...)

+0

Je suppose que vous parlez du DepthBuffer? Je ne sais pas vraiment comment l'utiliser, j'ai ajouté: spriteBatch.GraphicsDevice.RenderState.DepthBufferEnable = true; et cela n'a rien changé. Je dois l'utiliser dans le mauvais sens ... – jobadluck

Répondre

2

Il y a une surcharge de la méthode SpriteBatch.Draw qui offre un paramètre 'layerDepth' (de 0 pour l'avant, à 1 pour le retour). Vous pouvez définir layerDepth d'une image-objet individuelle et utiliser spriteSortMode.BackToFront dans la méthode SpriteBatch.Begin.

+0

Ok, je pense que c'est ce que je cherchais, mais comment accéder/définir ce 'layerDepth'? – jobadluck

+0

Créez une variable flottante par image-objet et définissez les variables sur la valeur que vous souhaitez attribuer à l'image-objet associée (en termes de profondeur). Insérez ensuite cette variable en tant que param dans la surcharge de la méthode Draw(). La logique que vous utilisez pour définir la variable dépend de vos besoins de conception de jeu, mais quel que soit le sprite que vous voulez à l'arrière, définissez sa variable plus proche de 1, selon ce que vous voulez vers l'avant, réglez leurs variables plus près de 0. N'oubliez pas pour définir le mode de tri dans la méthode Begin(). –

0

Ok, merci à Steve, je l'ai fait. Je viens de changer ma méthode SpriteBatch.Draw en SpriteBatch.Draw (X, X, (...), layerDepth) avec layerDepth étant mis à jour avec la position Y des joueurs. Doit utiliser spriteSortMode.FrontToBack: tout a été inversé car l'origine se trouvait dans le coin supérieur gauche. Merci!

+1

Cela aurait du être un commentaire –

0

La réponse de Steve est probablement la plus facile, mais parfois le dessin immédiat est favorable. Une alternative consiste à trier vos joueurs et objets dans une liste en fonction de leur axe Y.