videojuegos programar programa por funcion detectar colisiones colision activadas acciones 2d collision-detection allegro

2d - programar - programa acciones activadas por colisiones



¿La mejor forma de detectar la colisión entre los sprites? (7)

¿Cuál es la mejor forma de detectar colisiones en los sprites de un juego en 2d? Actualmente estoy trabajando en allegro y G ++


Colisiones entre qué? Depende si usas sprites, polígonos cóncavos, polígonos convexos, rectángulos, cuadrados, círculos, puntos ...


Cualquier biblioteca de gráficos 2D decente proporcionará sus propias funciones de detección de colisiones para todo, desde sprites alineados a polígonos a píxeles, o tendrá una o más bibliotecas de terceros para realizar esas funciones. Su elección de motor / biblioteca / marco debería dictar las opciones de detección de colisiones, ya que es probable que estén mucho más optimizadas de lo que podría producir solo.

Para Allegro está Collegro . Para SDL, está SDL_Collide.h o SDL-Collide . Puede usar I_COLLIDE con OpenGL. DarkBASIC tiene un sistema de colisión incorporado y DarkPhysics para interacciones muy precisas, incluidas las colisiones.


Esta pregunta es bastante general. Hay muchas maneras de realizar la detección de colisión en un juego 2d. Ayudaría saber qué estás tratando de hacer.

Sin embargo, como punto de partida, existen métodos bastante simples que permiten la detección entre círculos, rectángulos, etc. No soy un gran admirador de gamedev.net, pero hay algunos buenos recursos sobre este tipo de detección. Uno de esos artículos está aquí . Cubre algún material básico que podría ayudarlo a comenzar.

Los juegos básicos de 2d pueden usar rectángulos o círculos para "encerrar" un objeto en la pantalla. La detección de cuando los rectángulos se superponen o cuando los círculos se superponen es bastante directo matemático. Si necesita algo más complicado (como las polis arquitectónicas convexas), entonces la solución es más complicada. Nuevamente, gamedev.net podría ser de alguna ayuda aquí.

Pero para responder a su pregunta, necesitamos saber qué está tratando de hacer. ¿Qué tipo de juego? ¿Qué tipo de objetos estás tratando de colisionar? ¿Estás tratando de colisionar con los límites de la pantalla, etc.


Hay una gran cantidad de formas de detectar la detección de colisión. Los métodos que use se verán levemente alterados si dependen de si usa un entorno 2D o 3D. También recuerde cuando instale un sistema de detección de colisión, para tener en cuenta cualquier física que desee implementar en el juego (necesaria para la mayoría de los juegos descendentes en 3D) a fin de mejorar su realidad.

La versión corta es para usar recuadros delimitadores. O, en otras palabras, haga que cada entidad en el mundo sea un recuadro, luego verifique si cada uno de los ejes del recuadro colisiona con otras entidades.

Con grandes cantidades de entidades para comprobar colisiones, es posible que desee comprobar en un octree. Simplemente dividiría el mundo en sectores, luego solo verificaría la colisión entre objetos en los mismos sectores.

Para obtener más recursos, puede ir a sourceforge y buscar el motor de dinámica Bullet, que es un motor de física y detección de colisiones de código abierto, o puede visitar http://www.gamedev.net, que cuenta con abundantes recursos para el desarrollo de juegos abundantes. temas.


Usa una biblioteca, te recomiendo Box2D


Verificar la colisión entre dos bolas en 2D es fácil. Puedes googlearlo, pero básicamente verificas si la longitud del radio de las dos bolas combinadas es mayor o igual a la distancia entre el centro de las dos bolas.

Luego puede encontrar el punto de colisión tomando el vector unitario entre el centro de las bolas y multiplicándolo con uno de los radios de las bolas.


La implementación de un sistema de detección de colisión es un asunto complicado, pero debe considerar tres puntos.

  • Mundo de los objetos. Espacio de particionamiento Si haces una prueba de colisión contra cada sprite 2d en tu mundo contra todo lo demás, ¡tendrás un programa lento y lento! Debes priorizar Necesitas dividir el espacio. Puede usar un sistema de cuadrícula ortogonal y dividir su mundo en una cuadrícula 2d. O podría usar un árbol BSP, usando líneas como la función separadora.

  • Detección de colisión de fase amplia Utiliza volúmenes delimitadores como cilindros o elipses (lo que mejor se aproxima a la forma de sus sprites) para determinar si vale la pena comparar objetos con más detalle. La matemática para esto es fácil. Aprende tus transformaciones de matriz 2D. ¡Y para la intersección en 2d, incluso puedes usar tarjetas de video de alta potencia para hacer mucho del trabajo!

  • Detección de colisiones de fase estrecha Ahora que ha determinado que vale la pena comparar dos o más objetos, ingresa a su sección ajustada. El objetivo de esta fase es determinar el resultado de la colisión. Profundidad de penetración, volumen abarcado, etc. Y esta información se alimentará en cualquier motor de física que tenga planeado. ¡En 3d este es el reino de los algs de distancia GJK y otros algoritmos de neato que todos amamos tanto!

Puede implementar todo esto genéricamente y especificar polimórficamente las resoluciones amplia y estrecha, o proporcionar un enlace si está trabajando en un lenguaje de nivel inferior.