Sé que ya hay muchos recursos sobre esto, pero no he encontrado uno que coincida con mi sistema de coordenadas y estoy teniendo grandes problemas para ajustar cualquiera de esas soluciones a mis necesidades. Lo que aprendí es que la mejor manera de hacer esto es usar una matriz de transformación. Implementar eso no es un problema, pero no sé de qué manera tengo que transformar el espacio de coordenadas.
Aquí hay una imagen que muestra mi sistema de coordenadas:
¿Cómo transformo un punto en la pantalla a este sistema de coordenadas?
Respuestas:
Primero, aquí está el código. Seguirá una explicación:
Tenga en cuenta que este código no funcionará para el mapa que se muestra en su pregunta. Esto se debe a que los mosaicos impares se desplazan hacia la izquierda, mientras que el mosaico impar generalmente se desplaza hacia la derecha (como es el caso en el editor de mapas en mosaico ). Debería poder remediarlo fácilmente ajustando el valor x devuelto en el caso de mosaico impar.
Explicación
Esto puede parecer un método un poco más de fuerza bruta para lograr esta tarea, pero al menos tiene la ventaja de ser un píxel perfecto y un poco más flexible.
El truco consiste en ver el mapa no como una cuadrícula escalonada única, sino como dos cuadrículas superpuestas una encima de la otra. Existe la cuadrícula de filas impares y la cuadrícula de filas pares, pero en su lugar los llamamos rojo y verde para que podamos crear un diagrama bonito ...
Observe a la derecha de esa imagen que he marcado un punto con un punto morado. Este es el punto de ejemplo que intentaremos encontrar en nuestro espacio de mosaico original.
Lo que debe notarse sobre cualquier punto del mundo es que siempre se ubicará exactamente en dos regiones: una roja y una verde (a menos que esté en un borde, pero de todos modos es probable que se recorte dentro del límite de borde irregular). Encontremos esas regiones ...
Ahora para elegir cuál de las dos regiones es la correcta. Siempre habrá exactamente una respuesta.
Desde aquí podríamos hacer una aritmética más simple y calcular la distancia al cuadrado desde nuestro punto de muestra a cada punto central de las dos regiones. Cualquiera que sea el más cercano será nuestra respuesta.
Sin embargo, hay una forma alternativa. Para cada región de prueba, tomamos muestras de un mapa de bits que coincide con la forma exacta de nuestros mosaicos. Lo muestreamos en un punto traducido a coordenadas locales para ese mosaico único. Para nuestro ejemplo, se vería así:
A la izquierda, verificamos la región verde y obtenemos un hit (píxel negro). A la derecha probamos la región roja y obtenemos una falla (píxel blanco). La segunda prueba es, por supuesto, redundante, ya que siempre será exactamente una u otra, nunca ambas.
Luego llegamos a la conclusión de que tenemos un golpe en el mosaico impar en 1,1. Esta coordenada debería ser simple de mapear a las coordenadas del mosaico original usando una transformación diferente para las filas pares e impares.
Este método también le permite tener propiedades simples por píxel en los mapas de bits de prueba de píxeles. Por ejemplo, el blanco es un mosaico, el negro es un éxito, el azul es agua, el rojo es sólido.
fuente
Creo que el problema que tienes es con tu espacio de coordenadas. Las coordenadas que le ha dado a los mosaicos no son realmente una proyección isométrica: debe pensar que el xAxis va en diagonal hacia abajo a la derecha y el yAxis en diagonal hacia abajo a la izquierda (o alguna variante de eso)
en este momento, si se mueve a lo largo de los ejes de coordenadas ilustrados, viajará en una dirección diagonal en "espacio de mosaico" para que los cuadrados terminen como diamantes (y todo será más complejo)
La matriz de transformación que está buscando está construida a partir de esos ejes x e y. Es efectivamente lo mismo que hacer el siguiente cálculo.
Editar: acabo de encontrar una pregunta similar (pero con el sistema de coordenadas del que estaba hablando) y alguien dio una respuesta mucho más completa aquí:
¿Cómo convertir las coordenadas del mouse en índices isométricos?
fuente
Básicamente, desea obtener la posición del mouse en la ventana utilizando un detector de eventos, debe eliminar el desplazamiento de la posición del lienzo en la ventana de las posiciones del mouse, de modo que la posición del mouse sea relativa al lienzo.
Asumiré que sabe cómo escuchar eventos en el lienzo 'para mousemove, de lo contrario es posible que desee aprender más JS antes de considerar el diseño de juegos isométricos: D
fuente
Resolví esto cambiando el espacio de coordenadas. Ahora comienza sin un desplazamiento en la primera fila y para eso encontré un ejemplo de trabajo que pude ajustar un poco.
fuente