2010-12-13 17 views
15

Attualmente sto lavorando a un tipo di gioco 2D di ripresa e sto utilizzando un albero quad per i rilevamenti delle collisioni. Ho scritto un quad tree funzionante che spinge correttamente i miei attori nei nodi/foglie a cui appartengono nell'albero. Tuttavia, ho alcuni problemi.QuadTree per rilevamento collisione 2D

In primo luogo, in che modo utilizzo il mio quadrifoglio per selezionare contro quali altri oggetti un oggetto deve verificare le collisioni? Non sono sicuro di come sia fatto.

Che fa sorgere una seconda domanda. Diciamo che ho un oggetto nel nodo che non è un vicino di un altro nodo, ma che l'oggetto è abbastanza grande da occupare un numero limitato di nodi, come posso verificare una collisione effettiva, dal momento che immagino che l'albero potrebbe considerare che non è abbastanza vicino da scontrarsi con oggetti in un nodo "lontano"? Gli oggetti che non si adattano completamente a un nodo dovrebbero essere mantenuti nel nodo genitore?

Nel mio gioco, la maggior parte degli oggetti sono di dimensioni diverse e si spostano.

Ho letto un buon numero di blog/articoli su quadtrees ma la maggior parte spiega solo come costruire un albero che non è proprio quello che sto cercando.

Qualsiasi aiuto/informazione è benvenuto.

+2

Se il gioco che stai realizzando è davvero come il video che hai collegato, non dovresti usare affatto un indice spaziale, una lista di entità non ordinate sarà probabilmente più veloce fino a poche centinaia di oggetti in movimento. – SingleNegationElimination

+0

Dipende dalla collisione, penso ... probabilmente così per collisione basata su cerchi, probabilmente non per pixel-based. Inoltre, per il basso numero di oggetti che cercano i vicini in una lista ordinata 1D di siti di solito è più veloce, IIRC. Ma implementare un quadtree funzionante ne vale la pena per la pura esperienza. (E inoltre, i proiettili sparatutto alla moda dell'inferno possono avere centinaia di oggetti in movimento facilmente :)) – Kos

risposta

15

È possibile stabilire una convenzione per cui ogni elemento è contenuto nel nodo quadtree più piccolo che lo contiene completamente.

Poi, quando si controlla le collisioni per il nodo A, si procede in questo modo:

  1. nodo corrente = radice nodo
  2. collisioni controlla di A con ciascun elemento direttamente nel nodo corrente
  3. se A lattina essere contenuto interamente in uno dei sotto-nodi del nodo corrente, impostare il nodo corrente su quel sub-nodo e passare nuovamente a 2
  4. infine, controllare le collisioni di A con tutti gli elementi nei nodi figli del nodo corrente, in modo ricorsivo .

Si noti che più piccoli sono gli oggetti, più profondi saranno situati nel quad, quindi saranno confrontati meno spesso.

+0

BTW - questa convenzione dove * non * solo foglie può contenere elementi non è probabilmente l'unica che esiste - solo la prima che mi viene in mente Potresti esserti imbattuto in altre varianti che prendono ipotesi diverse e quindi necessitano di un approccio diverso. – Kos

+0

Quindi basicamente devo ripetere quei 4 passaggi per ogni oggetto nel gioco per testarlo per eventuali potenziali collisioni? – dotminic

+2

Sì, nel caso generale. Ma puoi avere più alberi contemporaneamente - ad esempio i proiettili non si scontrano con i proiettili, quindi puoi anche avere alberi separati per i proiettili e separarli, per esempio, dai nemici, e controllare ogni proiettile con l'albero nemico, ecc. Controlla la tua logica e pensa a quanti alberi hai effettivamente bisogno in questa variante :) – Kos

Problemi correlati