Question

Je veux faire des jeux iPhone isométriques, basés sur des carreaux avec COCOS2D.

Les sprites doivent être dessinés au sommet d'autres sprites qui sont "derrière". Je cherche la meilleure façon de le faire.

Je voudrais éviter l'algorithme du peintre car il s'agit de trier tous les sprites à chaque cadre qui est cher.

L'algorithme de tampon Z est pris en charge par le GPU et le COCOS2D, c'est donc ce que j'aimerais utiliser, mais il y a un problème. Certains sprites, comme les bâtiments par exemple, occupent plusieurs tuiles. Attribuer une valeur Z à de tels sprites est difficile.

Ce sont les options auxquelles j'ai pensé:

  1. Comparer deux bâtiments et déterminer lequel est "en face" est facile. Ainsi, les bâtiments peuvent être triés puis attribués une valeur Z en fonction de l'ordre de tri. Ce ne serait pas différent de l'algorithme du peintre. Le tampon OpenGL ES Z ne serait pas nécessaire.
  2. Attribuez une valeur Z à chaque bâtiment basé uniquement sur son emplacement sur la carte (sans savoir où se trouvent les autres bâtiments). Je trouve cela difficile. Je pense que c'est possible, mais je n'ai pas encore pu trouver de formule.
  3. Utilisez plusieurs sprites pour des images qui occupent plus d'une tuile, afin que tous les sprites soient exactement de la même taille. Les commandes de z peuvent alors être facilement attribuées en fonction de la tuile que le sprite occupe. Le problème avec cette solution est qu'il rend la logique de jeu beaucoup plus compliquée. Toutes les opérations sur un seul bâtiment devront être répétées pour chaque sprite dans lequel le bâtiment est composé. Je voudrais traiter chaque objet comme une seule entité.
  4. Modifiez le code COCOS2D pour permettre aux sprites d'avoir plusieurs valeurs Z à différents points. Si un sprite peut avoir plusieurs valeurs Z en fonction de la tuile d'une partie particulière du sprite sur, alors le calcul d'une valeur Z pour cette section est facile. Je n'aurai pas besoin de comparer le sprite à aucun autre sprite. Je crois que cela est possible en utilisant plusieurs quads pour chaque sprite. Le problème avec cela est que c'est un peu compliqué pour moi car je suis nouveau dans les ouverts et Cocos2D. Je ne comprends pas complètement comment fonctionnent toutes les structures de données internes. Bien que cela semble être la solution la plus élégante si une formule ne peut être trouvée.

Je voterai toutes les suggestions ou références à des ressources utiles.

Était-ce utile?

La solution

Pour # 2, vous pouvez calculer la distance Manhattan du centre de l'objet et utiliser cette valeur comme valeur Z de cet objet. Cela fonctionnera tant que vous évitera de très longs objets dans votre carte comme un objet 5x1 ou pire. Mais si vous avez vraiment besoin d'un long objet pour être placé sur une carte carrelée, gérer l'ordre z des objets dans la carte en définissant une valeur Z à l'aide d'une formule est impossible.

Pour prouver ceci:
1.) Placer deux objets 2x2 dans une carte horizontalement et laisser une carreau unitaire entre eux.
2.) Placez un objet 3x1 entre eux. Nommez les objets 2x2 vers A et B, et l'objet 3x1 à C.
3.) Si vous tournez simplement C (ne changeant pas sa position), l'ordre z de l'échange A et B.

-Si B est maintenant devant, certains objets derrière B seront devant A en raison de la rotation de C. et il est coûteux de savoir quels objets à l'arrière de A et B deviendront auparavant devant la rotation après C après C .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top