He estado creando un pequeño marco de cuadrícula hexadecimal para Unity3D y he llegado al siguiente dilema. Este es mi sistema de coordenadas (tomado de aquí ):
Todo funciona bastante bien, excepto por el hecho de que no tengo idea de cómo almacenarlo. Originalmente tenía la intención de almacenar esto en una matriz 2D y usar imágenes para generar mis mapas.
Un problema era que tenía valores negativos (esto se solucionaba fácilmente compensando un poco las coordenadas).
Sin embargo, debido a este sistema de coordenadas, dicha imagen o mapa de bits tendría que tener forma de diamante, y dado que estas estructuras tienen forma cuadrada, esto causaría muchos dolores de cabeza incluso si pirateo algo juntos. ¿Me falta algo que pueda solucionar esto? Recuerdo haber visto una publicación en el foro sobre esto en los foros de la unidad, pero ya no puedo encontrar el enlace.
¿Escribir un conjunto de traductores de coordenadas es la mejor solución aquí?
Si piensan que sería útil, puedo publicar código e imágenes de mi problema.
fuente
Respuestas:
Es más fácil trabajar con las coordenadas de paralelogramo que está utilizando, pero tienen el inconveniente de ser extrañas para los mapas rectangulares. Un enfoque es almacenarlo con las coordenadas de desplazamiento, pero en realidad usar coordenadas de paralelogramo en la lógica del juego.
Observación: en cada fila del mapa, los datos de la cuadrícula son contiguos. Todo el espacio desperdiciado está a la izquierda y a la derecha.
Solución: dentro de esa fila, almacene los datos comenzando en la columna más a la izquierda en lugar de la columna marcada con 0. Calcule la primera columna del mapa rectangular en su sistema de coordenadas , luego reste eso de la coordenada de la columna para determinar a qué parte de la matriz va. Esto también funciona para las coordenadas de columna negativas.
Realice la conversión en getter y setter para el mapa, con algo como esto:
Tendrá que modificar esto para trabajar con su elección de coordenadas y mapa (preste atención a las diferencias de uno a uno). En algunos diseños, querrá compensar las columnas por la fila en lugar de viceversa.
Puedes usar el mismo truco para hacer mapas de otras formas; No se limita a los rectángulos.
Si usa C o C ++, puede usar la aritmética de puntero para hacer esto más rápido. En lugar de almacenar una matriz de punteros en matrices, almacene una matriz de punteros que hayan sido ajustados por
first_column_in_row
. (Esto puede no ser portátil)fuente
yIndex = y-((x%2==0)?(x/2-x):(-x/2)-1)
después de algunas pruebas y errores. No tengo idea de cómo funciona duro.yIndex = y-((x%2==0)?(-x/2):(-x/2)-1)
. x / 2 es todo por cierto basado en números enteros, por lo que no hay necesidad de piso.Personalmente, preferiría la simplicidad sobre el ahorro de memoria. ¡No optimices hasta que sea necesario!
Si todavía está decidido a guardar algunos bytes, así es como puede hacerlo:
Código de Python para asignar coordenadas de rectángulo a coordenadas de paralelogramo y viceversa:
fuente
offsetY = Math.floor ( (x+1)/2 )
No es necesario distorsionar su mapa, ya que la conversión entre coordenadas rectangulares y "canónicas" es rápida y fácil. Aquí hay un enlace a una introducción sobre cómo hacerlo:
Conversión entre coordenadas hexadecimales rectangulares y canónicas
Esta técnica combina la evaluación diferida con el almacenamiento en caché de las conversiones calculadas.
fuente