Estoy escribiendo un juego 2D isométrico y tengo dificultades para determinar con precisión en qué mosaico está el cursor. Aquí hay un dibujo:
donde xs e ys son coordenadas de pantalla (píxeles), xt e yt son coordenadas de mosaico, W y H son ancho de mosaico y altura de mosaico en píxeles, respectivamente. Mi notación para coordenadas es (y, x) que puede ser confusa, lo siento.
Lo mejor que pude entender hasta ahora es esto:
int xtemp = xs / (W / 2);
int ytemp = ys / (H / 2);
int xt = (xs - ys) / 2;
int yt = ytemp + xt;
Esto parece casi correcto, pero me está dando un resultado muy impreciso, lo que dificulta la selección de ciertos mosaicos, o a veces selecciona un mosaico junto al que estoy tratando de hacer clic. No entiendo por qué y me gustaría que alguien pudiera ayudarme a entender la lógica detrás de esto.
¡Gracias!
Tuve el mismo problema para un juego que estaba escribiendo. Me imagino que este problema diferirá en función de cómo implementó exactamente su sistema isométrico, pero explicaré cómo resolví el problema.
Primero comencé con mi función tile_to_screen. (Supongo que así es como está colocando los mosaicos en la ubicación correcta en primer lugar). Esta función tiene una ecuación para calcular screen_x y screen_y. El mío se veía así (python):
Tomé esas dos ecuaciones y las convertí en un sistema de ecuaciones lineales. Resuelve este sistema de ecuaciones en cualquier método que elijas. (Utilicé un método rref. Además, algunas calculadoras gráficas pueden resolver este problema).
Las ecuaciones finales se veían así:
Como puede ver, no es tan simple como la ecuación inicial. Pero funciona muy bien para el juego que creé. ¡Gracias a Dios por el álgebra lineal!
Actualizar
Después de escribir una clase Point simple con varios operadores, simplifiqué esta respuesta a lo siguiente:
fuente
Estás usando un buen sistema de coordenadas. Las cosas se ponen mucho más complicadas si usas columnas escalonadas.
Una forma de pensar sobre este problema es que tiene una función para convertir (xt, yt) en (xs, ys). Seguiré la respuesta de Thane y la llamaré
map_to_screen
.Desea el inverso de esta función. Podemos llamarlo
screen_to_map
. Las funciones inversas tienen estas propiedades:Esos dos son buenos elementos para la prueba unitaria una vez que haya escrito ambas funciones. ¿Cómo se escribe el inverso? No todas las funciones tienen inversas pero en este caso:
Asegúrese de probar que la función inversa + original devuelve la respuesta con la que comenzó. Thane pasa ambas pruebas, si elimina el
+ TILE_HEIGHT/2
desplazamiento de renderizado. Cuando resolví el álgebra, se me ocurrió:que creo que es lo mismo que el de Thane
screen_to_map
.La función convertirá las coordenadas del mouse en flotadores; use
floor
para convertirlos en coordenadas de mosaico de enteros.fuente