2010-12-13 16 views
15

Actualmente estoy trabajando en un juego de disparos en 2D, y estoy usando un quad para mis detecciones de colisión. Escribí un cuadriciclo en funcionamiento que empuja correctamente a mis actores hacia los nodos/hojas a los que pertenecen en el árbol. Sin embargo, tengo algunos problemas.QuadTree para detección de colisión 2D

En primer lugar, ¿cómo utilizo mi quadtree para seleccionar contra qué otros objetos debe probar un objeto las colisiones? No estoy seguro de cómo se hace esto.

Lo que genera una segunda pregunta. Digamos que tengo un objeto en un nodo que no es vecino de otro nodo, pero que el objeto es lo suficientemente grande como para abarcar algunos nodos, ¿cómo puedo verificar una colisión real, ya que supongo que el árbol podría considerar que no es lo suficientemente cerca como para colisionar con objetos en un nodo "lejano"? ¿Deberían mantenerse los objetos que no encajan por completo en un nodo en el nodo padre?

En mi juego, la mayoría de los objetos son de diferentes tamaños y se mueven.

He leído un buen número de blogs/artículos sobre quadtrees pero la mayoría solo explica cómo construir un árbol que no es realmente lo que estoy buscando.

Cualquier ayuda/información es bienvenida.

+2

Si el juego que estás haciendo es realmente como el video que vinculaste, no deberías estar usando un índice espacial en absoluto. Una lista de entidades sin clasificar aún será más rápida hasta unos cientos de objetos en movimiento. – SingleNegationElimination

+0

Depende de la colisión, creo ... probablemente sea así para las colisiones basadas en círculos, probablemente no para las basadas en píxeles. Además, para un bajo número de objetos, buscar vecinos en una lista ordenada 1D de entidades suele ser el más rápido, IIRC. Pero implementar un quadtree de trabajo vale la pena por la experiencia pura. (Y también, los shoot'em ups bullet hell-trend pueden tener cientos de objetos en movimiento fácilmente :)) – Kos

Respuesta

15

Puede establecer una convención que cada elemento está contenido en el nodo quadtree más pequeño que lo contiene por completo.

A continuación, cuando se echa las colisiones para el nodo A, se procede de esta manera:

  1. actual nodo = nodo raíz
  2. colisiones de verificación de A con cada elemento directamente en el nodo actual
  3. si una lata estar contenido por completo en cualquiera de los subnodos del nodo actual, establecer el nodo actual en ese subnodo y volver a 2
  4. finalmente, verificar las colisiones de A con todos los elementos en los nodos hijos del nodo actual, recursivamente .

Tenga en cuenta que cuanto más pequeños sean los objetos, más profundos se ubicarán en el árbol cuádruple, por lo que se compararán con menos frecuencia.

+0

BTW- esta convención donde * no * solo las hojas pueden contener elementos probablemente no sea la única que existe- solo la primera que viene a mi mente Es posible que haya tropezado con otras variantes que toman suposiciones diferentes y, por lo tanto, necesitan un enfoque diferente. – Kos

+0

Entonces básicamente necesito repetir esos 4 pasos para cada objeto en el juego para probarlo en busca de posibles colisiones. – dotminic

+2

Sí, en el caso general. Pero puedes tener varios árboles a la vez, por ejemplo, las balas no chocan con las balas, por lo que incluso puedes tener árboles separados para las balas y separarlos, por ejemplo, enemigos, y controlar cada bala con el árbol enemigo, etc. Comprueba tu lógica y piensa cuántos árboles realmente necesitas en esta variante :) – Kos

Cuestiones relacionadas