Pregunta

¿Cuál es la mejor manera de detectar colisiones en sprites de un juego 2D?Actualmente estoy trabajando en allegro y G++.

¿Fue útil?

Solución

Hay una gran cantidad de formas de detectar la detección de colisiones.Los métodos que utilice se modificarán ligeramente dependiendo de si utiliza un entorno 2D o 3D.También recuerde que al implementar un sistema de detección de colisiones, debe tener en cuenta cualquier física que desee implementar en el juego (necesaria para la mayoría de los juegos de descenso en 3D) para mejorar la realidad del mismo.

La versión corta consiste en utilizar cuadros delimitadores.O en otras palabras, convierta cada entidad del mundo en una caja, luego verifique si cada uno de los ejes de la caja choca con otras entidades.

Con grandes cantidades de entidades para probar colisiones, es posible que desees registrarte en un octree.Simplemente dividiría el mundo en sectores y luego solo verificaría si hay colisiones 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 consultar http://www.gamedev.net que tiene muchos recursos sobre numerosos temas de desarrollo de juegos.

Otros consejos

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

Para Allegro hay colegio.Para SDL hay SDL_Collide.h o SDL-Colisión.Puedes usar I_COLLIDA con OpenGL.DarkBASIC tiene un sistema de colisión integrado y Física Oscura para interacciones muy precisas, incluidas colisiones.

Utilice una biblioteca, lo recomiendo. Caja2D

Esta pregunta es bastante general.Hay muchas formas de detectar colisiones en un juego 2D.Sería útil saber qué está intentando 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 es aquí.Cubre material básico que podría ayudarle a comenzar.

Los juegos 2D básicos pueden usar rectángulos o círculos para "encerrar" un objeto en la pantalla.La detección de cuándo se superponen rectángulos o círculos es una matemática bastante sencilla.Si necesita algo más complicado (como polis articulares convexas), entonces la solución es más complicada.Nuevamente, gamedev.net podría ser de alguna ayuda aquí.

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

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

  • Mundo de objetos.Partición del espacio.Si haces una verificación de colisión con cada 2d sprite de tu mundo y con todo lo demás, ¡tendrás un programa lento!Necesitas priorizar.Necesitas dividir el espacio.Puedes usar un sistema de cuadrícula ortogonal y dividir tu mundo en una cuadrícula 2D.O podría usar un árbol BSP, usando líneas como función separadora.

  • Detección de colisión de fase amplia Esto utiliza volúmenes delimitadores, como cilindros o elipsos (que se aproxime mejor la forma de sus sprites) para determinar si vale la pena comparar los objetos con más detalle.Las matemáticas para esto son fáciles.Aprenda sus transformaciones matriciales 2D.Y para la intersección 2D, ¡incluso puedes usar tarjetas de video de alta potencia para hacer gran parte del trabajo!

  • Detección de colisión de fase estrecha Ahora que ha determinado que vale la pena comparar dos o más objetos, entra en 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 introducirá en cualquier motor de física que haya planeado.¡En 3D, este es el reino de las algoritmos de distancia GJK y otros algoritmos geniales que todos amamos tanto!

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

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

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top