Sencillo motor de colisiones 2D para XNA/MonoGame

Sencillo motor de colisiones 2D para XNA/MonoGame
Published on 03 January 2013

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

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

Categories