Iré directamente y diré que no sé cómo resolver el problema que ha descrito en la pregunta (detección de colisión entre rectángulos con forma de mosaico iso), pero puedo decirle cómo otros lo han resuelto en el pasado :
La forma en que se hace en otros juegos es separar el mundo del juego del mundo de la pantalla . Cuando comienzas, es común imaginar que son lo mismo, pero luego te lleva a problemas como el que estás describiendo.
La idea general es que el mundo del juego se almacena completamente en la memoria, detrás de escena, solo son números, referencias y lógica. El hecho de que estés dibujando el mundo del juego en isométrico es irrelevante. Su mundo de juego no debería tener el concepto de isométrico, o cuadrado, o incluso si la pantalla se dibuja en 3D. Todo eso se soluciona cuando dibujas el mundo del juego en la pantalla (también conocido como el mundo de la pantalla ). El mundo del juego debe almacenarse y mantenerse de la manera más simple que tenga sentido para el juego, en los juegos isométricos, generalmente ignoras por completo el hecho de que es iso y, en cambio, almacena las posiciones como si estuvieras usando una cuadrícula alineada por ejes. La mayoría de los juegos tendrán métodos para convertir coordenadas entre los dos mundos, yo llamo el mío ScreenToWorld(x, y)
yWorldToScreen(x, y)
. La conversión a menudo se realiza con Matemáticas de Matrix, pero se puede lograr de otras maneras. Utilizará ScreenToWorld cuando use el mouse y WorldToScreen cuando dibuje.
Hay varias ventajas en dividir el mundo del juego y el mundo de la pantalla . Una de las ventajas es que la detección de colisiones y el movimiento ocurren en el mundo del juego y, por lo tanto, generalmente son bastante directos porque no se trata de una cuadrícula inclinada, coordenadas torcidas, o dónde está la pantalla, etc. En su caso , estaría tratando con rectángulos y cuadrados alineados con ejes. Una vez que el mundo del juego se ha actualizado, dibuja una representación del mundo del juego en la pantalla, palabra clave: representación. Puede parecer contradictorio al principio, pero su pantalla es solo una representación de lo que está sucediendo en el mundo del juego. Esto hace posible cosas como servidores dedicados y clientes similares a terminales.
FreeCiv es en realidad un gran ejemplo de todas estas cosas. Puede ver el mismo mundo exacto que cualquiera de: una cuadrícula norte / sur cuadrada, isométrica o incluso hexadecimal. Cada juego que ejecutas tiene un servidor dedicado que se ejecuta en segundo plano, incluso para juegos de un solo jugador, por lo tanto, el cliente también es solo un puerto de pantalla, nada más.
Larga historia corta: separar el mundo del juego y la lógica del mundo de la pantalla simplifica la lógica del juego, reduce el acoplamiento de la pantalla del juego <-> y, a su vez, hace que la detección de colisiones entre fichas "iso" sea más fácil de manejar y de visualizar.