Domanda

Qual è il modo migliore per rilevare le collisioni negli sprite di un gioco 2D?Attualmente sto lavorando in allegro e G++

È stato utile?

Soluzione

Esistono numerosi modi per rilevare il rilevamento delle collisioni.I metodi utilizzati verranno leggermente modificati a seconda che si utilizzi un ambiente 2D o 3D.Ricorda inoltre, quando istituisci un sistema di rilevamento delle collisioni, di tenere in considerazione qualsiasi fisica che potresti voler implementare nel gioco (necessaria per la maggior parte dei giochi 3D di discesa) al fine di migliorarne la realtà.

La versione breve consiste nell'utilizzare i riquadri di delimitazione.O in altre parole, trasforma ogni entità nel mondo in una scatola, quindi controlla se ciascuno degli assi della scatola è in collisione con altre entità.

Con grandi quantità di entità da testare per le collisioni, potresti voler effettuare il check-in in un octree.Divideresti semplicemente il mondo in settori, quindi controllerai solo la collisione tra oggetti negli stessi settori.

Per ulteriori risorse, puoi andare su sourceforge e cercare il motore di dinamica dei proiettili che è un motore fisico e di rilevamento delle collisioni open source, oppure puoi dare un'occhiata http://www.gamedev.net che ha molte risorse su numerosi argomenti di sviluppo di giochi.

Altri suggerimenti

Qualsiasi libreria grafica 2D decente fornirà le proprie funzioni di rilevamento delle collisioni per qualsiasi cosa, dagli sprite allineati ai poligoni ai pixel, oppure avrà una o più buone librerie di terze parti per eseguire tali funzioni.La scelta del motore/libreria/framework dovrebbe dettare le scelte di rilevamento delle collisioni, poiché sono probabilmente molto più ottimizzate di ciò che potresti produrre da solo.

Per Allegro c'è Collegro.Per SDL esiste SDL_Collide.h O SDL-Collide.Puoi usare IO_COLLIDE con OpenGL.DarkBASIC ha un sistema di collisione integrato e DarkPhysics per interazioni molto accurate, comprese le collisioni.

Usa una biblioteca, mi raccomando Scatola2D

Questa domanda è piuttosto generale.Esistono molti modi per eseguire il rilevamento delle collisioni in un gioco 2D.Sarebbe utile sapere cosa stai cercando di fare.

Come punto di partenza, tuttavia, esistono metodi piuttosto semplici che consentono il rilevamento tra cerchi, rettangoli, ecc.Non sono un grande fan di gamedev.net, ma ci sono alcune buone risorse su questo tipo di rilevamento.Uno di questi articoli è Qui.Copre alcuni materiali di base che potrebbero aiutarti a iniziare.

I giochi 2D di base possono utilizzare rettangoli o cerchi per "racchiudere" un oggetto sullo schermo.Il rilevamento di quando i rettangoli si sovrappongono o quando i cerchi si sovrappongono è un calcolo abbastanza semplice.Se hai bisogno di qualcosa di più complicato (come un poliartibrario convesso), la soluzione è più complicata.Ancora una volta, gamedev.net potrebbe essere di aiuto qui.

Ma davvero per rispondere alla tua domanda, dobbiamo sapere cosa stai cercando di fare?Che tipo di gioco?Che tipo di oggetti stai cercando di scontrare?Stai cercando di scontrarti con i limiti dello schermo, ecc.

L'implementazione di un sistema di rilevamento delle collisioni è una questione complicata, ma è necessario considerare tre punti.

  • Mondo degli oggetti.Partizionamento dello spazio.Se esegui un controllo di collisione contro ogni sprite 2D nel tuo mondo contro tutto il resto, avrai un programma lento!È necessario dare la priorità.È necessario partizionare lo spazio.Puoi utilizzare un sistema di griglia ortogonale e suddividere il tuo mondo in una griglia 2D.Oppure potresti usare un albero BSP, usando le linee come funzione separatore.

  • Rilevamento di collisioni in fase ampia Questo utilizza volumi di delimitazione come cilindri o elissi (a seconda di quale evento si avvicina alla forma degli sprite il meglio) per determinare se vale la pena confrontare o meno gli oggetti.I conti per questo sono facili.Impara le trasformazioni della matrice 2D.E per l'intersezione 2D, puoi anche utilizzare schede video ad alta potenza per svolgere gran parte del lavoro!

  • Rilevamento della collisione in fase ristretta Ora che hai determinato che vale la pena confrontarsi con due o più oggetti, entri nella tua sezione sintonizzata.L'obiettivo di questa fase è determinare il risultato della collisione.Profondità di penetrazione, volume compreso, ecc...E queste informazioni verranno inserite in qualunque motore fisico tu abbia pianificato.In 3D questo è il regno degli algoritmi a distanza GJK e di altri algoritmi accurati che tutti amiamo così tanto!

Puoi implementare tutto questo in modo generico e specificare polimorficamente le risoluzioni ampia e stretta o fornire un hook se stai lavorando in un linguaggio di livello inferiore.

Collisioni tra cosa?Dipende se usi sprite, poligoni concavi, poligoni convessi, rettangoli, quadrati, cerchi, punti...

Controllare la collisione tra due palline in 2D è facile.Puoi cercarlo su Google ma fondamentalmente controlli se la lunghezza del raggio delle due palline combinate è maggiore o uguale alla distanza tra il centro delle due palline.

Quindi puoi trovare il punto di collisione prendendo il vettore unitario tra il centro delle palline e moltiplicandolo per il raggio di uno delle palline.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top