Di recente ho lavorato su uno sparatutto in 2D frenetico e ho riscontrato un grosso problema. Rilevazione di collisioni. Certo, funziona, ma è molto lento. Il mio obiettivo è: avere molti nemici sullo schermo e fare in modo che non si tocchino. Tutti i nemici inseguono l'entità giocatore. Molti di loro hanno la stessa velocità così prima o poi finiscono per occupare lo stesso spazio mentre inseguono il giocatore. Questo lascia davvero cadere il fattore divertente poiché, per il giocatore, sembra che tu sia inseguito da un solo nemico. Per impedire loro di occupare lo stesso spazio, ho aggiunto un rilevamento delle collisioni (un rilevamento 2D di base, l'unico metodo che conosco) che è.
Enemy class update method
Loop through all enemies (continue; if the loop points at this object)
If enemy object intersects with this object
Push enemy object away from this enemy object
Funziona benissimo. Finché avrò solo <200 entità nemiche. Quando mi avvicino a 300-350 entità nemiche il mio frame rate inizia a calare pesantemente. Per prima cosa ho pensato che fosse un cattivo rendering, quindi ho rimosso il call call. Questo non ha aiutato affatto, quindi ovviamente ho capito che era il metodo di aggiornamento. L'unica parte pesante nel loro metodo di aggiornamento è questa parte di ogni nemico. Quando mi avvicino a 300 nemici, il gioco esegue 90000 (300x300) passaggi. Mio mio ~
Sono sicuro che ci deve essere un altro modo per ottenere questo rilevamento delle collisioni. Anche se non ho idea di come. Le pagine che trovo riguardano come eseguire effettivamente la collisione tra due oggetti o come controllare la collisione tra un oggetto e una piastrella. Conosco già queste due cose.
tl; dr? Come posso applicare il rilevamento delle collisioni tra LOTTI di entità?
Modifica rapida: se è di aiuto, sto usando C # XNA.