Recientemente he estado trabajando en un juego de disparos 2D de ritmo rápido y me encontré con un gran problema. Detección de colisiones. Claro, está funcionando, pero es muy lento. Mi objetivo es: tener muchos enemigos en la pantalla y hacer que no se toquen. Todos los enemigos persiguen a la entidad del jugador. La mayoría de ellos tienen la misma velocidad, tarde o temprano, todos terminan ocupando el mismo espacio mientras persiguen al jugador. Esto realmente elimina el factor diversión ya que, para el jugador, parece que solo un enemigo te persigue. Para evitar que ocupen el mismo espacio, agregué una detección de colisión (una detección 2D muy básica, el único método que conozco) que es.
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
Esto funciona bien Mientras solo tenga <200 entidades enemigas, eso es. Cuando me acerco a 300-350 entidades enemigas, mi velocidad de fotogramas comienza a caer fuertemente. Primero pensé que era una mala representación, así que eliminé su llamada de dibujo. Esto no ayudó en absoluto, así que, por supuesto, me di cuenta de que era el método de actualización. La única parte pesada en su método de actualización es esta parte de cada enemigo en bucles a través de cada enemigo. Cuando me acerco a 300 enemigos, el juego realiza una iteración escalonada de 90000 (300x300). Mi mi ~
Estoy seguro de que debe haber otra forma de abordar esta detección de colisión. Aunque no tengo idea de cómo. Las páginas que encuentro tratan sobre cómo hacer realmente la colisión entre dos objetos o cómo verificar la colisión entre un objeto y un mosaico. Ya sé esas dos cosas.
tl; dr? ¿Cómo abordo la detección de colisión entre MUCHAS entidades?
Edición rápida: si sirve de ayuda, estoy usando C # XNA.