|
|
|||||||||
Sí puedes leer esta frase, la página ha sido actualizada. |
| El Amiga Me Encanta ha conseguido el permiso por escrito de IDG Comunications España para ofrecer los artículos de la revista Amiga World España. |
![]() |
TRAYECTORIAS Por Armand Mata y Miquel Cardona. Con el programa incluído en éste artículo podrá definir, |
Una parte interesante en los juegos de arcade es aquella que controla la trayectoria de los objetos móviles de la pantalla. Este artículo está pensado para juegos del tipo "mata todo lo que encuentres", en los que el jugador tiene mucha libertad para moverse por la pantalla, pero sin duda también es útil para juegos como, por ejemplo, "Impossible Mission", donde se tiene una libertad de movimientos menor. En este artículo dividiremos las trayectorias en dos tipos: fijas y variables. Las trayectorias fijas corresponden a las que tienen predeterminada la ruta que seguirán por la pantalla, y las variables son las que basan su camino o trayectoria en algún elemento de la pantalla con una trayectoria aleatoria.
|
|
Como ya hemos dicho, son trayectorias predeterminadas, pero esto se puede dar por dos caminos:
A través de una fórmula matemática que calcula todos los puntos.
A través de una tabla de puntos que definan la ruta a seguir.
El manejo de tablas generalmente es mucho más rápido en cuanto a tiempo de proceso, pero es menos flexible en cuanto a modificaciones de la trayectoria. En los dos modos, se pueden aplicar ciertas transformaciones a todos los puntos, como son la traslación, la simetría respecto a un eje o respecto a un punto, rotaciones, etc.
Gráfica 1: Ejemplo de persecución 1 |
Generalmente se dan en ecuaciones paramétricas.
x = f1(t) y = f2(t)
Para obtener los distintos puntos se hace varias t. Si t varía más rápido, aumentamos la velocidad con que se mueve el objeto. Por ejemplo, una elipse de ejes paralelos a los ejes x e y se define como:
x = xc + A*cos(w*t) y = yc + B*sin(w*t) (Listado1 - Gráfica 1)
donde xc,yc son las coordenadas del centro de la elipse, A=radio del eje x, B=radio del eje y, t es un número real, y w es una constante (frecuencia angular). Si t se incrementa, la trayectoria gira en un sentido, mientras que si t se decrementa, gira en el contrario. Si A=B=R obtenemos una circunferencia de radio R. Si w = 2*Pi, haciendo variar t entre 0 y 1 obtenemos la trayectoria completa de una elipse (una vuelta). Si cambias la variable "paso" modificarás el salto que da tu sprite entre posición y posición.
Espiral: x = xc + K1*t*cos(w*t) y = yc + K2*t*sin(w*t) (Gráfica 2)
Esta espiral parte del centro para t=0 y se va alejando. En el listado 2 hemos modificado el parámetro para hacer que la elipse parta del exterior hacia el centro; posteriormente se aleja del centro y, cuando vuelve a la posición inicial, reinicializamos "t" para que repita la misma trayectoria.
Curvas de Lissajous: corresponden a la fórmula general
x = xc + A*cos(w1*t+phi1) y = yc + B*sin(w2*t+phi2) (Listado 3 - Gráfica 3)
si w1/w2 es un número racional, entonces la trayectoria descrita se repite después de un determinado número de "vueltas". La elipse no es más que un caso particular de curva de Lissajous en que w1=w2 y phi1=phi2. Como curiosidad observa que ocurre cambiando la variable "paso" por 0.5 o 5, por ejemplo.
|
Gráfica 2: Ejemplo de persecución 2 |
Las tablas de valores se pueden obtener "muestreando" la posición del ratón o a partir de fórmulas, guardando los distintos valores de x e y. El movimiento del objeto se obtiene recorriendo la tabla secuencialmente y dibujando en la posición marcada por la tabla, introduciendo entre las distintas lecturas un retardo; cuanto menor sea éste, mayor será la velocidad con que se moverá el objeto. Tanto en el modo 1) como en el 2) se pueden obtener trayectorias derivadas de ellas sumando valores a las x y a las y (desplazamiento), o bien calcular la trayectoria simétrica respecto a un punto o respecto a un eje, o efectuar una rotación.
VECTORES de 2 dimensiones:
Un vector s=(sx,sy) se representa como sigue:
(gráfica 4)
|
El módulo del vector s, lsi es su longitud, y se calcula lsl=sqr(sx2+sy2).
Un vector de módulo 1 se denomina vector unitario.
Un vector unitario en la dirección de s será
us=(ux,uy)=(sx/lsl,sy/lsl).
Un vector de módulo m y de dirección igual a la de s será m=(m*ux,m*uy). Suma de 2 vectores: si tenemos r=(rx,ry) y s=(sx,sy), el vector suma v=(vx,vy)=r+s=(rx+sx,ry+sy).
El vector definido por 2 puntos (x1,y1),(x2,y2) tiene por coordenadas (x,y)=(x2-x1,y2-y1).
Las rutinas de persecución se basan en la cinemática.
Se define el vector de posición r=(x,y) como el vector que une el origen de coordenadas con la posición del móvil.
Definimos la velocidad v=(vx,vy) como la variable que experimenta el inc(r)= vector de posición por unidad de tiempo v=lim ---- = dr/dt t2->t1 inc(t), La aceleración a=(ax,ay)=dv/dt=d2r/dt2.
En el movimiento rectilíneo uniforme, v es constante, y r=r0+v*(t-10).
Gráfica 3: Ejemplo de persecución 3 |
De este modo, podemos definir la trayectoria, velocidad y aceleración mediante ecuaciones en función de t, que se relacionan entre si por medio de derivación e integración. Afortunadamente, podemos realizar unas aproximaciones que nos simplifican enormemente el cálculo:
Si consideramos incrementos de tiempo suficientemente pequeños, podemos considerar que durante ellos el móvil se mueve con movimiento rectilíneo uniforme.
Dado que las unidades son arbitrarias, podemos considerar que el incremento de tiempo entre dos intervalos consecutivos vale 1, con lo que tendremos vx=vx0+ax, vy=vy0++ay, x=x0+vx, y=y0+vy.
Presentan un objeto móvil (un círculo dibujado con CIRCLE (x,y),8) que persigue el puntero del ratón.
Primero determinamos el vector a. Entonces calculamos v = v0 + a. finalmente, r = r0 + v, que, expresado en coordenadas, resulta:
x = x0 + vx y = y0 + vy
(Hemos tomado incremento de t = 1).
Es la más sencilla posible de todas las rutinas de persecución. Básicamente ejecuta el siguiente algoritmo:
Si xm >= xp + incremento_x entonces xp = xp + incremento_x. Si xm <= xp - incremento_x, xp = xp - incremento_x. Si ym >= ym + incremento_y, yp + incremento_y. Si ym <= yp - incremento_y, yp = yp - incremento_y
Calculamos d2 = (xm-xp)2 + (ym-yp)2 (distancia al cuadrado). Si d2 es menor o igual que dmin2, hay colisión (en el listado persecución_1 el valor es 30). Esta rutina es fácil de implementar en código máquina gracias a las instrucciones de multiplicación que posee el µP 68000. Y por tanto también será rápida.
Copiamos las sucesivas posiciones de objeto perseguido en un array utilizado de forma cíclica, es decir, cuando completamos el último elemento del array, utilizamos el primer elemento como posición n+1. El objeto perseguidor se limita a seguir los pasos del perseguido con un cierto retraso, pero si éste se para, el otro no lo hace, con lo cual va disminuyendo la distancia que los separa.
El listado persecución_2 ilustra este caso. Esta rutina es también muy sencilla de implementar en lenguaje máquina, igual que persecución_!.
El vector velocidad del "perseguidor" P está dirigido hacia el "perseguidor" M, y tiene módulo constante. Es decir, P se dirige a M con una velocidad constante. Ecuaciones resultantes:
vx = lvl*(xm-xp0)/sqr/((xm-xp0)*(xm-xp0)+(ym-yp0)*(ym-xp0)) vy = lvl*(ym-yp0)/sqr((xm-xp0)*(xm-xp0)+(ym-yp0)*ym-yp0)) xp = xp0+vx yp = yp0+vy
Nota: La posición actual de M es (xm,ym); la posición anterior de P es (xp,yp); la velocidad de P es (vx,vy).
Es una variante de la anterior en la que existe una cierta inercia en el movimiento de P. Los cambios respecto a las ecuaciones anteriores son:
ax = lal*(xm-xp0)/sqr((xm-xp0)*(xm-xp0)+(ym-yp0)*ym-yp0)) ay = lal*(ym-yp0)/sqr((xm-xp0)*(xm-xp0)+(ym-yp0)*(ym-yp0)) vx = ki*vx+ax vy = ki*vy+ay
(En el programa a = 7)
La constante ki es arbitraria, y surge debido a que sin ella las sucesivas xp, yp oscilan demasiado. Los valores experimentales que funcionan bien están comprendidos entre ki=0 y ki=0.85. Si ki=0 no existe inercia. Prueba con ki = 0.99 ¡y ya verás!
El módulo de la aceleración de P es inversamente proporcional a la distancia al cuadrado que lo separa de M. Es del tipo de la aceleración gravitatoria.
ax = K*(xm-xp0)/((xm-xp0)*(xm-xp0)+(ym-yp0)*(ym-yp0)) ay = K*(ym-yp0)/((x,-xp0)*(xm-xp0)+(ym-yp0)*(ym-yp0)
El resto de formulas no varían.
El módulo de la aceleración de P disminuye linealmente al aumentar la distancia que separa P de M hasta llegar a la distancia mdl1, a partir de la cual dicho módulo es constante (ver gráfica 3).
Si am es la aceleración máxima de P (cuando la distancia es nula), y a0 es la aceleración de P cuando la distancia es mayor o igual a mdl1:
lal = am - (am-a0)*mdl/mdl1 para 0<= mdl <= mdl1 lal = a0 para mdl >= mdl1
Todas estas rutinas pueden realizarse en código máquina, con el consiguiente aumento de velocidad. Para crear sprites en este lenguaje o en C deberás leerte el Rom Kernel: Libraries and Devices o algún número anterior de Amiga World.
|
|
|
|
|
|
|
|
|
| Envía esta página web a un amigo: Esta opción está desactivada temporalmente, rogamos disculpen las molestias |
|