Detección isométrica de colisión

11

Tengo algunos problemas al intentar detectar la colisión de dos mosaicos isométricos.

Intenté trazar las líneas entre cada punto en el mosaico y luego buscar intercepciones de línea, pero eso no funcionó (probablemente debido a una fórmula incorrecta)

Después de analizar esto por un tiempo hoy, creo que estoy pensando mucho en ello y debe haber una manera más fácil.

No estoy buscando código, solo algunos consejos sobre la mejor manera de lograr la detección de superposición

Chris Crew
fuente
44
¿Qué estás tratando de hacer exactamente? ¿Detecta cuando el mouse está sobre un mosaico o detecta si dos unidades se superponen? Si es más tarde, realmente deberías pensar en separar tu "juego" de los "gráficos"
John McDonald
Necesito hacerlo cuando el lado de un mosaico iso en movimiento golpea un mosaico no móvil, el mosaico en movimiento se detiene. La única cosa con la que tengo problemas es la prueba de colisión. Podría usar una caja encuadernada pero necesito que la colisión sea precisa.
Chris Crew

Respuestas:

23

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.

John McDonald
fuente
Gracias por la respuesta bien explicada, estaba separando la lógica de lo que se ha dibujado y lo que está sucediendo en el fondo, pero estaba tratando todo como una cuadrícula inclinada.
Chris Crew
1
Para las personas del futuro; Los gráficos son una interpretación de los datos. Las cuatro piezas principales de un juego: lógica, datos, entrada, salida. Evite agruparlos. Además, excelente respuesta John, +1
Aarowaim
9

La respuesta de John es bastante correcta, pero intentaré explicarla de una manera diferente:

No hay detección de colisión isométrica.

La detección de colisión no le importa cómo se ve su matriz / transformación de proyección. La detección de colisión no debería importar si renderiza las cosas (después de todo, los objetos que están fuera de la pantalla aún pueden colisionar, ¿verdad?)

Es una pregunta más filosófica: ¿un árbol que cae en un bosque todavía choca con el suelo cuando no hay nadie allí?

La sabiduría convencional diría: Sí. No importa cómo lo mires. Las cosas chocan en el espacio mundial, no en el espacio visual.

MarkR
fuente
2
+1 Bien puesto. "NO HAY detección de colisión isométrica"
John McDonald
1
Gracias, acabo de decir lo que ya dijiste. Pero un poco diferente.
MarkR
0

Puede intentar asignar una matriz de píxeles que componen un mapa de bits de cada valor getRGB () de cada píxel individual. Luego, compare los valores con una declaración if, ya que los bordes del mosaico son un valor de color separado del que representa el mosaico (agua, arena, hierba). Eso para una grilla isométrica básica. O puede tener dos capas del mapa en sí. Una capa que contiene una especie de pantalla verde que dibuja el contorno de cada representante de un objeto en colisión y la otra capa será el mapa en sí.

No está componiendo una matriz de mapa de bits de cada píxel de la capa del mapa, sino que desea calcular un conjunto de colores que representan los efectos que tiene cuando un objeto colisiona / intersecta el borde del valor de color de mantenimiento. O desea que los valores disminuyan o aumenten la velocidad en la que se mueve el objeto. Cada objeto que se mueve es solo un duplicado de la memoria almacenada en un lugar diferente.

Examinaría la colisión perfecta de píxeles y la comprensión de las matrices de mapas de bits. Cada rectángulo es un límite que contiene datos de replicación, como una especie de memoria impresa, cada evento se dispara dependiendo de dónde se representa un objeto en una ubicación o vector. Cada punto de la pantalla está en un plano 2D solo que la profundidad de la sombra proporciona una ilusión de que el objeto se representa a sí mismo como 3D. La transformación de formas en un sesgo le da la sensación de que el objeto está en ángulo. Hay un punto central en el que la cámara lo presenta, ve todo lo que se lleva alrededor de este punto central alejándose de él disminuyendo de tamaño o acercándose a él aumentando de tamaño.

Олег Игоревич
fuente