Detección de Colisiones (2D)

Era claro que tarde o temprano acabaríamos hablando de las colisiones, e los tutoriales anteriores hemos visto como mover texto, imágenes etc… pero de nada sirve mover si no se produce una interacción con el usuario, asi que vamos con las ideas claves de la detección de colisiones.

Por suerte XNA incorpora un sistema bastante fácil de detección de colisiones, hay varias estrategias, yo os cuento la más fácil e inmediata. La idea se trata en envolver los objetos en unos recipientes y comprobar luego si estos recipientes están chocando.
En este ejemplo en concreto usaremos los BoundingBox la idea que os quería dar a entender es la siguiente:
bounding1

Donde las lineas discontinuas representan los «envoltorios» para comprobar si hay colisión.

Para comprobar si hay colisión entre objetos podemos usar el método Intersecs que devolverá True si hay colisión o false en caso contrario:
bounding2

Podéis ver en el código fuente más detalles, para dudas y demás dejad un comentario.

Código fuente:

Detectando Colisiones.zip (XNA 2.0)

Detectando Colisiones.zip (XNA 3.0)

Detectando Colisiones.zip (XNA 4.0)

Vea también

Detección de colisiones (XNA Recursos)

Detección de colisiones (XNA Community)

Anuncio publicitario

14 pensamientos en “Detección de Colisiones (2D)

  1. Hola, me gustaría saber, porqué en este programilla, funciona correctamente todo excepto cuando le das a la tecla de bajar, que se sale la caja 2 de la pantalla.
    Muchas gracias, un saludo! Excelentes tutoriales!

    • Pues no tengo el código ahora mismo delante, pero seguramente haya algun error en los cálculos para controlar que no se salga la caja por los bordes, con un poco de debug seguro que lo solucionas!

  2. están buenísimos los tutos…. los he estado siguiendo estos días, y por lo visto no descansaré hasta verlos y hacerlos por completo cada uno de ellos! 🙂

    tengo dos dudas…

    tengo una duda respecto a este tutorial en específico, ese bounding es siempre una figura rectangular ?, qué pasa si es un objeto circular ?, que sucede o cómo haríamos si es una figura irregular ?… sigue sirviendo ese médotod de Intersects ?…

    porque sé que las lógicas de colisiones lleva siempre su buena matemática, he visto la del cuadrado, y la de circulo y figuras medianamente determinadas, pero sería innecesario (a menos que quiera hacer uno su propio engine) ya que existes métodos (cajitas negras) como Intersects y diferentes engines que incorporan esas propiedades…
    usas un engine de físicas específico y que funcione con xna4.0 ?, o cual me recomiendas ?

    • Hola Miguel!
      me alegro que te estén sirviendo de utilidad 😀

      Xna creo que también tiene una bounding sphere para objetos esféricos, si estás pensando en utilizar colisiones para algún juego puedes utilizar algunas de las librerías 2D o 3D que existen para xna.

      Normalmente para 3D existen otros tipos de primitivas a parte de cajas o rectángulos, como cápsulas, cilindros, etc. Lo más normal es aproximar una figura irregular a base de figuras regulares.

      En 2D también podrías usar diferentes rectángulos para poder adaptarlo a tu figura, pero si realmente es una forma geométrica que no se adapta bien a nada… siempre puedes probar deteccion por pixel, en este enlace puedes ver más información, te recomiendo que mires los demás tutoriales de esa serie, que están muy muy bien: http://create.msdn.com/en-US/education/catalog/tutorial/collision_2d_perpixel

      Un saludo!

  3. Excelentes tutoriaes! se agradece que haya gente dispuesta a enseñar su trabajo ya que en español no hay mucho sobre XNA.

Deja una respuesta

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s