lunes, 5 de enero de 2015

Veneno: comportamiento

El comportamiento del enemigo, el veneno, está formado por una serie de animaciones y funciones pseudoaleatórias, es tan sencillo que no me he atrevido a titular al artículo como inteligencia artificial, creo que es abusar del término la chorrada que yo he hecho.

Enemigo: veneno

Lo primero es que no todos los enemigos se mueven y evalúan su inteligencia artificial todo el tiempo. Solo lo hacen los que están a una cierta distancia del héroe. Cada segundo se evalúa la distancia de todos los venenos vivos al personaje, y si están a una cierta distancia se activan y sino se desactivan. Esto, de estar bien hecho no debería afectar mucho a la hora de jugar, ya que los personajes que no vemos en pantalla ni están cerca, nos da igual si se mueven o están quietos, y así vamos ahorrando procesamiento de comportamiento.

Ahora mismo evalúo la distancia de todos los venenos (unos 30) en un mismo frame cada segundo. Tampoco es exagerado, se hace en cpu y calcular 30 distancias casi ni se nota. Pero cuando ya estoy empezando a tener problemas de frame-rate por la cámara, todo lo que pueda aligerar es bueno. Y sobre todo no concentrar mucho más cálculo en unos frames que en otros para que no se noten algunos más largos, que visualmente canta. La solución a esto es sencilla, evaluar si debe estar activo o no 1 enemigo por frame, si son 30 enemigos y el juego fuera a 30 fps, estaría evaluando igual que ahora, 1 por segundo para cada personaje, pero más equilibrado. Por otro lado quiero cambiar la forma de medir distancias, para calcular una distancia se usa una raíz cuadrada, que es una operación asumible, pero algo más cara que multiplicaciones, por lo que si podemos ahorrarla eso que ganamos. En este caso se puede, me da igual decir que la distancia es 100 o que el cuadrado de la distancia es 10.000. Y al trabajar en el cuadrado de la distancia me ahorro la raíz cuadrada, el último paso del cálculo.

La animación interna del veneno es muy sencilla y procedural, no lleva animaciones. Solo se mueve verticalmente un poco, como un bamboleo. Esto le da un poco de sensación de ligereza y de movimiento, no es algo suspendido en el aire, fijo, sino que vuela.

Y la parte que la mayor parte de la gente consideraría IA: Las rutinas de decisión se ejecutan 2 veces por segundo. Hace 2 cosas: la primera comprobar la altura del suelo. El bicho flota en el aire, pero a una cierta altura del suelo, y necesita saber la altura del suelo, y lo hace con un raycast, por eso no lo hago en cada frame. Esto provoca que si hay durante ese medio segundo ha ido avanzando por una cuesta de repente pegue un subidón. Lo voy a arreglar cambiando la forma de hacer el bamboleo vertical, para que siempre sea suave. La segunda cosa es decidir si ataca o no (en el caso de estar en reposo), que se decide con un número aleatorio. Y si ataca mira donde está el jugador y va a por él, carga directamente, spear. Cada 2 segundos actualiza la posición del personaje, sino, si estabas lejos, el enemigo podía venir a tu encuentro y en lo que llegaba tu ya estabas en Sebastopol, y quedaba raro. Una vez que el veneno llega a destino o colisiona con el personaje, traza un punto al azar de retirada y se dirige allí. Al retirarse en una dirección al azar se hace más difícil adivinar sus movimientos, si tienes varios venenos, parece que revolotean un poco alrededor. Si el veneno es herido hay una posibilidad al azar de que se enfade, nos muestre su cara mala, y en ese estado es más agresivo (más probabilidad de ataque) y es más rápido.

Con esto, aun sin las mejoras que he ido proponiendo durante el artículo se consigue un comportamiento bastante aceptable. Me gustaría añadir un segundo tipo de enemigo, inicial, más fácil que se mueva en patrones fijos, sin atacar al personaje y en partes más avanzadas se mezclen los dos tipos de enemigo.

No hay comentarios :

Publicar un comentario