Sencillo motor de colisiones 2D para XNA/MonoGame

Una de las cosas que siempre se me han resistido a la hora de intentar hacer un juego plataformas 2D, y como a mi a mucha más gente, es el implementar correctamente las colisiones y su respuesta (el detectar paredes o suelos y saber ubicar correctamente el objeto cuando colisiona con el entorno).

Cierto es que hoy día existen muchas alternativas para evitar programarte un sistema de colisiones y respuesta para un juego de plataformas. Existen varios motores de físicas 2D para múltiples plataformas y lenguajes, Box2D por ejemplo, que lo implementan varias herramientas de desarrollo de juegos como Stencyl y que es muy popular en juegos Flash, o Farseer Physics Engine para XNA, que se ha usado en varios proyectos de XBox360 y Windows Phone y que están portando a MonoGame. El problema, al menos con Farseer Physics Engine que es al que le dedique tiempo en su momento, es que me resulto extremadamente complejo de implementar y configurar todos los parámetros y propiedades que tiene así como lograr ajustar la escala de medida del sistema de físicas con la escala en pixeles en pantalla para poder dibujar un sprite acorde con su representación física. En definitiva, una API muy poco amigable para la mayoría de la gente.

En mi ultima incursión con MonoGame para tratar de llevar a cabo un prototipo del Proyecto TLSA basado de lo ultimo que tenia programado en XNA para Windows Phone 7, decidi volver a intentar desarrollar desde cero el sistema de colisiones que hice para el proyecto GreyInfection. El resultado es un sistema muy sencillo y muy básico de colisiones entre cajas (colisiones perpendiculares, nada de ángulos ni rotaciones), sin simulación de gravedad ni fuerzas, con su sistema de respuesta para que un objeto móvil sepa responder a una colisión con otro objeto de la escena. El sistema incluye también un trazador de rayos, para calcular trayectorias para disparos o bien para localizar objetivos en un rango de visión por ejemplo. Este sistema serviría tanto para juegos de plataformas como juegos de vista superior, en definitiva, cualquier juego 2D que necesite calcular colisiones y determinar su respuesta.

El proyecto, publicado en mi repositorio de GitHub, incluye un ejemplo practico donde se ve el sistema en acción, con el código comentado.

2DCollisionSample en GitHub: https://github.com/VisualStudioEX3/2DCollisionSample

El código esta programado de forma que no debiera ser un problema para portarlo a otros lenguajes y frameworks.

Salu2…

P.D.: Si este sistema te parece excesivamente sencillo y buscas implementar algo más avanzado echa un ojo a los turoriales de Metanetsoftware, creadores del juego N, con código fuente y demostraciones en vivo de las tecnicas:

N tutorial A – Basic Collision Detection and Response
N tutorial B – Grid-Based Collision Detection and Raycasting

6 pensamientos en “Sencillo motor de colisiones 2D para XNA/MonoGame”

    1. Si, pensé que lo había mencionado pero veo que se me paso :-/ Farseer Physics Engine esta implementado con Box2D desde su versión 3.0, donde se noto el cambio para bien en cuanto a rendimiento, sobre todo en la XBox360. Lastima que la API siga siendo tan poco amigable xD

      Salu2…

      1. Lo digo más que nada porque por el tono de la frase das a entender que son dos engines totalmente diferentes (O igual soy yo que soy muy tiquismiquis)

        Pero bueno, eso es lo de menos…. Lástima que no sea una API algo más manejable, puede hacer algunas cosas increíbles. Y esta implementada en casi cualquier cosa. De echo, Codea, un programilla para desarrollar videojuegos en el iPad con el que ando trasteando ultimamente incluye en su API un wrapper de box2d. A día de hoy me siguen llamando mucho más la atención los motores de física 2d que los 3D. No se por que.

        Pero yo me quedo con el original de C++ …. Maldito el día que se me ocurrió bajar el código y mirarlo. Que dolor de cabeza….

        Si te gustan esas chorradas merece la pena que juguetees un poco con Algoodo (http://www.algodoo.com/wiki/Home) Cada vez que lo pruebo se me cae la baba…

        1. Hombre, es que son 2 motores distintos. Box2D es una cosa y FPE es otra. Aunque el segundo se base en Box2D su API segun pude ver no es igual, de hecho FPE implementa cosas nuevas asi como wrappers para facilitar prefabricados de cuerpos complejos y demas. Igual, si no recuerdo mal Box2D implementa ragdolls, FPE no (no al menos en las versiones que toque).

          Box2D quise mirarlo para usarlo junto FlashPunk en Flash (y de entrada me parecio más sencillo que FPE), pero salvo que necesite fisicas reales seguramente porte este sistema de XNA a ActionScript3.

          De todos modos ahora estare metido con Unity3D los proximos meses asi que de momento estare alejado de estos temas.

          Salu2…

  1. Sera casualidad para empezar el año, pero despues de haber publicado AnimalCards para W8, hoy comienzo a retomar Mono para implementar mi primer juego en W8, probare el codigo de colision, porque tb probe farseer y en algunos casos considero que es demasiado aunque esta muy bien.A ver si consigo rememorar mi memoria XNA, gracias por el codigo.

Deja un comentario