O, como dirían en español:
Comportamientos de dirección en Ruby.
Estos sirven para crear agentes autónomos que navegan un ambiente. Un agente armado con estos comportamientos puede ir tras otro, huir de él, esconderse, ser parte de una formación, etc.
Unos de los más interesantes de observar son los comportamientos en manada (flocking behaviors), pero sobre eso ya vendrá otro artículo.
En este fin de semana programé estos cuatro:
- Seek (búsqueda)
- Flee (huir)
- Arrive (llegar)
- Pursuit (persecusión)
Espero poder incluir los demás pronto, aunque creo que refactorizaré un poco antes de implementar más cosas.
Estoy planeando usarlos en mi siguiente juego, que como les había comentado es un clon del Missile Commander (ese donde tenías que derribar los misiles enemigos con los propios antes de que tocaran el suelo y destruyeran tu base).
El código
No está comentado por el momento y seguramente se puede mejorar en muchas partes, ya lo iré limpiando y ajustando en las próximas semanas.
Entre las cosas que contiene hay una clase llamada Viewport que creé para poder jugar con mis agentes en un espacio más grande sin que el tamaño de la pantalla fuera una limitante. Velo como un sandbox que puedes configurar con un tamaño arbitrario.
Por ejemplo, puedes tener un espacio virtual de 4000×3000 pixeles dentro de un viewport que mide 800×600 pixeles (reales) dentro de tu pantalla configurada a 1024×768.
Además se comporta como un toroide, es decir, los agentes pasan de un lado al otro, no pueden salirse de él.
Esto lo implementé porque estoy pensando mostrar cada comportamiento en un viewport diferente, pero todos en la misma pantalla.
Creo que también se podría usar para implementar un mini mapa, ¿no?
El demo
Hay tres agentes de diferentes colores en el demo.
Usa tu ratón. Al dar clic en algún lugar de la pantalla se pondrá una marca verde y sucederán 3 cosas:
- El agente verde huirá de ella.
- El agente blanco llegará a ella.
- El agente rojo perseguirá al blanco, prediciendo su posición futura, ésta se muestra como una marca blanca enfrente del agente blanco.
Presiona D para ocultar el texto informativo.
Presiona Esc para salir del demo.
Pueden bajar la aplicación demo de GitHub: ruby_steering_behaviors
Estoy usando como referencia el excelente libro: Programming AI by Example.
Implementación en C++
Para los que anden buscando una implementación en C++ existe OpenSteer.
OpenSteer is a C++ library to help build steering behaviors for autonomous characters in games and animation. OpenSteer provides an app which displays predefined demos of steering behaviors. You can prototype, visualize and debug your own as a plug-in.
License: MIT License

Saludos Lobo Tuerto, resulta que estuve probando lo que pones de steering behaviors pero en Cuba donde vivo el google code está cerrado, y ahora tampoco tenemos acceso a sourceforge.net la zona de descarga. Será que los requerimientos puedes ponerlos en algún lugar que pueda descargarlos? (gosu gem)
Saludos
De hecho ya tengo un artículo al respecto en el blog, checa este:
http://lobotuerto.com/blog/2009/07/14/como-instalar-rubygosu-en-ubuntu-9-04-jaunty-jackalope/
¡Saludos hasta Cuba!