[IA] Steering Behaviors en XNA (I de II)

Los Steering Behaviors son formas de comportamiento autónomas para agentes de un videojuego. El concepto y definición de los mismos proviene de Craig Reynolds. En esta serie de artículos propondré una implementación para algunos de estos steering behaviors, intentando hacerlo con un diseño lo más desacoplado, flexible y extensible posible. Todo ello intenentando superar mi primera aventura en el ámbito en este post anterior.

En este “episodio” os ofrezco la implementación de estos steering behaviors (uso denominaciones en inglés, ya que son las usadas en el mundillo y las que os facilitarán encontrar más información si lo necesitáis). No entro demasiado en la definición funcional de cada steering behavior, ya que puede encontrarse en el blog de Craig Reynolds. Ahí va un pequeño resumen:

  • Seek: Consiste en perseguir un objetivo o Target, intentando acercarse a él de forma directa.
  • Flee: Huye del Target, alejándose de él.
  • Arrive: El mismo behavior que el Seek, sólo que este reduce la velocidad suavemente antes de alcanzar el objetivo.
  • Pursuit: Persigue al Target con mayor “inteligencia”, es decir, en vez de acercarse de forma directa al objetivo, realizaremos una estimación de su posición futura teniendo en cuenta el vector de velocidad en cada momento.
  • Evade: Al igual que el pursuit, intenta escapar del Target intentando estimar la posición futura del perseguidor, en lugar de alejarse de forma directa.
  • Wander: El agente se desplaza de forma errática, calculando un punto aleatório del área de un círculo situado enfrente del agente.

Mis favoritos son el Pursuit, que con un sencillo algoritmo genera una sensación de “inteligencia”, y el Wander, que nos permite tener un agente que se desplaza de forma totalmente autónoma. Otro elemento a destacar es el diseño de esta implementación. Creo que es bastante flexible, aunque seguro es mejorable. Permite fácilmente integrar una máquina de estados finitos, para que el agente pueda cambiar de behavior en cualquier momento. Además podrían solaparse varios steering behaviors en un mismo agente a la vez… (aunque no tiene sentido solapar un seek y un flee, la utilidad de esto la veremos en la siguiente “entrega”).

En el siguiente diagrama vemos que la clase SteeringBehaviors tiene instancias de otras clases, que representan cada uno de los comportamientos. Esto lo he hecho así para dotar de mayor flexibilidad a la implementación, y hacer el código menos complejo y por tanto más fácil de entender, mantener y extender. Cuando utilizemos esta clase desde cualquier juego para nuestros agentes, deberemos añadirles el Behavior con el método sobrecargado AddBehavior (con una sobrecarga para cada tipo de Behavior), y posteriormente llamando al método Update. El método update, el solito se encargará de ejecutar todos los steering behaviors que correspondan al agente. ¿Fácil, verdad?

Todos los steerings tienen una estructura común, aunque sus especializaciones pueden contener distintos atributos y métodos, como muestra este diagrama de ejemplo (no se incluyen todos los behaviors que contiene el código):

Como siempre os dejo el código adjunto para que lo provéis/uséis a vuestra conveniencia. Este vídeo refleja el resultado de la ejecución del programa:

 [View:http://www.youtube.com/watch?v=JLoU7SQZCmM:550:0]

10 comentarios en “[IA] Steering Behaviors en XNA (I de II)”

  1. Hola, excelente articulo, hacia tiempo que no te visitaba, tu blog cada vez tiene más calidad y es de más obligada visita.
    Comentas que tienes el código, pero no encuentro el link por ningún sitio, o se te ha olvidado ponerlo o estoy ciego 🙂

  2. Gracias por los comentarios.

    El problema con el código es que si consultas el blog desde la página principal no lo ves. Si pinchas en el título del artículo ahí puedes descargar el código.

    Limitaciones del blog… sorry chicos…

    Un saludo,

    JB

  3. Buen artículo Jesús,

    Me me leeré todo lo que escribas sobre IA ya que a este tema nunca le he dedicado mucho tiempo y así voy aprendiendo.

    Quedo a la espera de alguna demo sobre IA en 3D XD.

    Saludos

  4. Muchas gracias Javier,

    Aunque no habrá ejemplo de IA en 3D, al menos por ahora, el motivo es que la clase de steering behaviors te sirve tanto para 2D como para 3D… (usa la Y del Vector2 como Z y listos…).

    La idea es que la complejidad no está en el número de dimensiones de los vectores o en los gráficos, sino en los algoritmos.

    En el próximo artículo hablaré de como evitar las colisiones, y aunque seguiré utilizando objetos de tipo Vector2, te servirá lo mismo para la mayoría de juegos 3D.

    Un saludo

  5. Bueno con lo de 3D me refería a algoritmos más propios de juevos 3D, como estos que usan los juegos tipo half life 2 de “pizarra compartida” en la que los malos se organizan entre ellos para luchar contra ti. Creo que tienen una serie de cosas (protocolo) que hay que hacer, por ejemplo dos esperan detras de una puerta y otro abre la puerta, pues utilizan esta “pizarra” para ir escribiendo el rol que se pide cada uno y una vez asignados los roles entran en acción.

    Pero vamos ya te digo que no se mucho, esto lo leí en una revista hace ya tiempo XD.

  6. Half life 2? Uff, ya me gustaría a mi conocer/entender sus algoritmos xD Aunque el tema que comentas parece interesante, ¿si tienes más info puedes enviármela?

    Si te fijas en el post anterior hablaba de maquinas de estados y envíos de mensajes entre ellas, que permitirían hacer eso de forma “muy simple”, pero imagino que en HL2 utilizan algo mucho más potente.

    Tomo nota de tus comentarios 😉

  7. Muy bueno, me ha encantado el resultado como el otro ejemplo de steering behaviors de tu blog, seguro que acabo usando la idea.
    Gracias y saludos!!!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *