Taller
>> Taller >> Curso de Inteligencia Artificial by Slàinte >> I.A. no condicionada.



El tipo de comportamiento más sencillo de conseguir es éste, ya que no hay que preocuparse de nada de lo que ocurre en pantalla.

La manera de afrontar este tipo de movimiento depende del tipo de trayectoria que deba describir el proceso, pero la inmensa mayoria puede resolverse con lo que daremos en llamar trayectorias incrementales.

Definición

Una trayectória incremental se almacena como un array (tabla) bidimensional que contiene la diferencias entre la coordenada x,y de un proceso en el frame actual y el anterior.

Veamos un ejemplo:

Contenidos del array de trayectoria incremental
INC_XINC_Y
X2 - X1Y2 - Y1
X3 - X2Y3 - Y2

Para conseguir ahora que se realice el movimiento, en cada frame variamos las coordenadas x,y del proceso sumando los incrementos INC_X en INC_Y para el frame siguiente.

PROCESS nave(graph)

PRIVATE
  trayectoria[1,1] = 50,50,50,50 ;
  paso = 0;

BEGIN
    x = 0 ;
    y = 0 ;
  LOOP
    FRAME ; // PINTAMOS LA NAVE
    IF (paso < 2)
      X += trayectoria[paso,0] ;  // INCREMENTAMOS X
      Y += trayectoria[paso,1] ;  // INCREMENTAMOS Y
      paso++ ;
    END
  END
    
END


Recomendación

Para que el movimiento sea suave y fluido, aumenta los fps del programa (duplica la frecuencia base por ejemplo, subiendo hasta 48 fps) y reduce los incrementos en X,Y al máximo.

Otra de las maneras más comunes de almacenar trayectorias fijas es determinando puntos de control de la trayectoria.

Definición

Los puntos de control de una trayectoria son puntos de paso obligado para el proceso, que de manera autónoma debe conseguir alcanzar. En función de la trayectoria se interpolan (calculan) puntos intermedios adecuados hasta alcanzar el siguiente punto de control, desde el que se repite la operación hacia el siguiente punto de control.

Para este caso, el ejemplo anterior queda modificado de la siguiente manera:

Contenidos del array de trayectoria por puntos de control
XY
X2Y2
X3Y3

Lo primero que nos ha de llamar la atención es que almacenamos coordenadas absolutas de pantalla, a diferencia del caso del array incremental, en que almacenábamos coordenadas relativas a las coordenadas instantáneas del proceso. Este hecho hace el array incremental muy útil en zonas con cálculo relativo de distancias (scrolls, por ejemplo) ya que el comportamiento no se ve afectado por la posición inicial del proceso respecto al scroll. Una implementación a través de puntos de control también puede ser usada en esos casos, pero ha de tenerse cuidado en desvincular las relaciones entre la x,y dentro del scroll y la x,y dentro de pantalla, por lo que este segundo método es más apropiado para pantallas estáticas o casos en que la trayectoria se calcula respecto a las coordenadas absolutas de pantalla.

Para interpolar ahora los puntos necesarios en la trayectoria supongamos que interpolaremos 10 puntos entre cada punto de control, para lo cual debemos calcular los incrementos relativos en x e y (debe saberse la posición inical):

PROCESS nave(graph)

PRIVATE
  trayectoria[2,2] = 0,50,100,0,50,100 ;
  paso = 1 ;
  puntos = 10 ;
  interpolados = 1 ;

BEGIN
    x = trayectoria[0,0] ;
    y = trayectoria[0,1] ;
    LOOP
      FRAME ; // PINTAMOS LA NAVE
      IF (paso =< 2)
        IF (interpolados > puntos) interpolados=0 ; paso++ ; END
        x = x + ((trayectoria[paso,0]-trayectoria[paso-1,0])/puntos)
             // INCREMENTAMOS X
        y = y + ((trayectoria[paso,1]-trayectoria[paso-1,1])/puntos)
             // INCREMENTAMOS Y
        interpolados++ ;
      END
    END
    
END


Ayuda

Para una trayectoria circular, siguiendo un trayecto entre 90º y 0º con el incremento en y constante el cálculo de la interpolación quedaría igual para la y, pero la x sería:
x = trayectoria[paso-1,0] + (trayectoria[paso,1] - trayectoria[paso-1,1]) * (sin (acos (((1000 * (trayectoria[paso,1]-y))/(trayectoria[paso,1]-trayectoria[paso-1,1])))/1000).

Jugando con la función primitiva de la trayectoria conseguiremos las fórmulas de interpolación adecuadas. Sobretodo, tened cuidado con las funciones trigonométricas en DIV, contad que está por ahi ese multiplicador de miligrados que fastidia mucho si no lo recuerdas...

Nos faltaría cubrir, en el caso de ser necesario, cuándo dispara o hace algo en particular el proceso que tiene la I.A., pero la verdad, la cantidad de acciones posibles a tener en cuenta es infinita... baste decir que controlando si se está a punto para hacer la acción o no (puede ser de forma aleatoria con RAND o verse afectado por a que distancia esté el enemigo por ejemplo). Ese campo ya depende más de cada juego que del cometido de este curso así que os invito a que profundiceis un poco en ello por vuestra cuenta.

Y con esto se acaba la parte referente a la I.A. no condicionada independiente.


[ INTRODUCCIÓN ]    [ ENTREGA 1 ]    [ DEPENDIENTE ]