Récemment, je travaille sur un jeu de tir 2D rapide et je suis tombé sur un problème majeur. Détection de collision. Bien sûr, cela fonctionne, mais c'est très lent. Mon objectif est: Avoir beaucoup d'ennemis à l'écran et les empêcher de se toucher. Tous les ennemis poursuivent l'entité du joueur. La plupart d'entre eux ont la même vitesse, donc tôt ou tard, ils finissent tous par prendre le même espace tout en poursuivant le joueur. Cela fait vraiment chuter le facteur amusant car, pour le joueur, il semble que vous ne soyez poursuivi que par un seul ennemi. Pour les empêcher de prendre le même espace, j'ai ajouté une détection de collision (une détection 2D très basique, la seule méthode que je connaisse) qui est.
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
Cela fonctionne bien. Tant que je n'ai que <200 entités ennemies, c'est. Lorsque je me rapproche de 300 à 350 entités ennemies, ma fréquence d'images commence à chuter fortement. J'ai d'abord pensé que c'était un mauvais rendu, j'ai donc supprimé leur appel de tirage. Cela n'a pas aidé du tout, bien sûr, j'ai réalisé que c'était la méthode de mise à jour. La seule partie lourde de leur méthode de mise à jour est cette partie de chaque ennemi en boucle à travers chaque ennemi. Lorsque je me rapproche de 300 ennemis, le jeu fait une itération par étapes de 90000 (300x300). Mon mon ~
Je suis sûr qu'il doit y avoir une autre façon d'approcher cette détection de collision. Bien que je ne sache pas comment. Les pages que je trouve sont sur la façon de faire réellement la collision entre deux objets ou comment vérifier la collision entre un objet et une tuile. Je connais déjà ces deux choses.
tl; dr? Comment puis-je aborder la détection de collision entre BEAUCOUP d'entités?
Édition rapide: si c'est pour toute aide, j'utilise C # XNA.