J'ai créé un petit cadre de grille hexadécimal pour Unity3D et suis arrivé au dilemme suivant. Voici mon système de coordonnées (extrait d' ici ):
Tout fonctionne très bien, sauf que je ne sais pas comment le stocker. J'avais initialement l'intention de stocker cela dans un tableau 2D et d'utiliser des images pour générer mes cartes.
Un problème était qu'il avait des valeurs négatives (cela a été facilement corrigé en décalant un peu les coordonnées).
Cependant, en raison de ce système de coordonnées, une telle image ou bitmap devrait être en forme de losange - et puisque ces structures sont de forme carrée, cela causerait beaucoup de maux de tête même si je pirate quelque chose ensemble. Y a-t-il quelque chose qui me manque qui pourrait résoudre ce problème? Je me souviens avoir vu un message sur ce sujet dans les forums de l'unité, mais je ne trouve plus le lien.
L'écriture d'un ensemble de traducteurs de coordonnées est-elle la meilleure solution ici?
Si vous pensez que ce serait utile, je peux poster du code et des images de mon problème.
Réponses:
Les coordonnées du parallélogramme que vous utilisez sont plus faciles à utiliser, mais elles ont l'inconvénient d'être étranges pour les cartes rectangulaires. Une approche consiste à le stocker avec les coordonnées de décalage mais à utiliser des coordonnées de parallélogramme dans votre logique de jeu.
Observation: dans chaque ligne de la carte, les données de la grille sont contiguës. Tout l'espace perdu est à gauche et à droite.
Solution: dans cette ligne, stockez les données en commençant par la colonne la plus à gauche au lieu de la colonne marquée 0. Calculez la première colonne de la carte rectangulaire dans votre système de coordonnées , puis soustrayez-la des coordonnées de la colonne pour déterminer où elle va dans le tableau. Cela fonctionne également pour les coordonnées de colonne négatives.
Effectuez la conversion dans le getter et le setter pour la carte, avec quelque chose comme ceci:
Vous devrez le modifier pour travailler avec votre choix de coordonnées et de carte (faites attention à une différence). Dans certaines dispositions, vous souhaiterez compenser les colonnes par la ligne au lieu de l'inverse.
Vous pouvez utiliser la même astuce pour créer des cartes d'autres formes; ce n'est pas limité aux rectangles.
Si vous utilisez C ou C ++, vous pouvez utiliser l'arithmétique des pointeurs pour accélérer les choses. Au lieu de stocker un tableau de pointeurs dans des tableaux, stockez un tableau de pointeurs qui ont été ajustés par
first_column_in_row
. (Cela peut ne pas être portable)la source
yIndex = y-((x%2==0)?(x/2-x):(-x/2)-1)
après quelques essais et erreurs. Je ne sais pas comment cela fonctionne dur.yIndex = y-((x%2==0)?(-x/2):(-x/2)-1)
. x / 2 est entièrement basé sur des nombres entiers, donc pas besoin de plancher.Personnellement, je préférerais la simplicité à la sauvegarde de la mémoire. N'optimisez pas tant que vous n'en avez pas besoin!
Si vous êtes toujours déterminé à économiser quelques octets, voici comment vous pouvez le faire:
Code Python pour mapper les coordonnées du rectangle aux coordonnées du parallélogramme et inversement:
la source
offsetY = Math.floor ( (x+1)/2 )
Il n'est pas nécessaire de déformer votre carte, car la conversion entre les coordonnées rectangulaires et "canoniques" est rapide et facile. Voici un lien vers une introduction sur la façon de le faire:
Conversion entre les coordonnées hexagonales rectangulaires et canoniques
Cette technique combine une évaluation paresseuse avec la mise en cache des conversions calculées.
la source