Volver menú revistas Volver página anterior

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.

N° 56 - Julio/Agosto 1994
Amiga World

TRAYECTORIA DE BOBS EN AMOS


Por Fernando López Ostenero

Gracias a la facilidad
que tiene el AMOS para
manejar los BOBS (objetos
del BLITTER) podemos
realizar pequeñas
animaciones con ellos

Con AMOS podemos manejar gráficos y crear animaciones, tales como hacer que un ordenador camine por nuestras pantallas o cualquier cosa que se nos ocurra.

Sin embargo, para lograr trayectorias curvas suaves, deberemos emplear funciones matemáticas tales como Seno, Coseno o Tangente. Todas esas funciones son también accesibles desde el AMOS, pero para ello necesitamos acceder a las librerías matemáticas del directorio LIBS: tales como la 'mathieedoutrans.library' o alguna por el estilo con el consiguiente gasto de memoria y pérdida de velocidad.

Todo esto es muy fácil de arreglar, sin más que ir metiendo las coordenadas de una serie de puntos diferentes de la trayectoria en cuestión en una tabla de valores, para luego irlos recuperando y mostrando el bob en su sitio correspondiente sin tener que calcular cada vez las coordenadas.

Desde el modo directo escribimos una instrucción más o menos como la siguiente:

Reserve as Data n,longitud

Esto nos reserva un banco de memmoria de número n y con la longitud deseada. Este banco lo emplearemos como tabla para ir metiendo los diferentes valores que necesitamos. Para ello utilizaremoslas instrucciones:

Doke dirección, dato

Escribe el valor dato (comprendido entre 0 y 65536) en la dirección deseada. Esta dirección debe ser una dirección de memoria válida. Para asegurarnos de que esa dirección existe haremos:

INIT=Start(n)

Con lo que en la variable INIT tenemos la dirección de memoria del inicio del banco n, que es nuestra tabla, y así incrementando de dos en dos esa dirección podremos acceder a los diferentes valores de la tabla. Digo de dos en dos, porque como la mayoría de las veces utilizaremos resoluciones altas, no podemos conformarnos con coordenadas de un solo byte, para lo que necesitaremos valores de dos bytes.

DATO=Deek(dirección)

Así recuperamos el valor almacenado en esa dirección en la variable DATO. Con lo que ya estamos en condiciones de crear nuestra tabla de valores y de recuperarlos cuando nos hagan falta.

Unicamente decir que cuando grabamos nuestro programa el banco creado se grabará con él, gracias a que lo hemos definido como banco de datos. Si en alguna ocasión necesitamos un bando de estas características haremos:

Reserve as Work n,longitud

Y así el banco no se grabará con el programa. Hay que puntualizar que el AMOS buscará la memoria pedida primero en la FAST y si no es posible lo hara en la CHIP. Si delante de la palabra Data (o Work) ponemos 'Chip' forzaremos al programa a buscar esa memoria en la CHIP. No es una buena idea hacer esto último, ya que podemos encontrarnos ante desagradables sorpresas.


UNA TRAYECTORIA SENCILLA

Comenzaremos por crear una trayectoria circular, alrededor de un centro y con el radio deseado.

En primer lugar definimos tres variables con los valores X e Y del centro, y otro con el valor del radio. Después realizamos un bucle que vaya desde cero hasta el valor 2*pi#(pi#=3.141592), que son los ángulos inicial y final de una circunferencia.

Ajustamos el valor de incremento para que realice unas 50 pasadas, es decir el incremento será de (2*pi#)/50. Hay que tener en cuenta que cuanto mayor sea el número de pasos a calcular más perfecta será la circunferencia, y que cuanto mayor sea el valor del radio más pasos deberemos calcular. En definitiva hay que ir probando para dar con el valor adecuado.

Para calcular lascoordenadas X e Y correspondientes a cada punto hacemos lo siguiente:

X=Xcent+Radio*Cos(ángulo)

Y=Ycent-Radio*Sin(ángulo)

Y ejecutamos el programa. Unicamente hay que tener en cuenta que el valor del ángulo lo deberemos almacenar en una variable no entera, para lo cual añadiremos al nombre de la variable el carácter '#'. Y decir que el número pi lo podemos obtener gracias a que el AMOS lo tiene almacenado como constante con el nombre de PI#.

Con una ligera variación lograremos una trayectoria elíptica. Simplemente asignando un radio distinto para la coordenada X y otro para la coordenada Y.

El programa que acompaña a este artículo es un ejemplo de lo aquí comentado. En primer lugar reservamos un banco de memoria de 10000 bytes para la tabla de la trayectoria, después definimos el punto central y el valor del radio horizontal.

A continuación variamos el radio vertical desde 200 hasta cero, dibujando una serie de elipses horizontales que degeneran hasta una línea recta. Después desplazamos el puntero hasta el polo norte de la esfera y repetimos el proceso variando el radio horizontal. El resultado podemos observarlo en el gráfico que acompaña al artículo.

Reserve As Data 2,10000
D=Start(2)
Global D
Default Palette 0,4095
Screen Open 0,640,512,2,Hires+Laced
Curs Off
Change Mouse 1
Plot 520,256
Rem **** TRANSFORMACION DE TRAYECTORIA CIRCULAR A ELIPTICA ****
XCENT=320 : YCENT=256 : RADIOX=200
Global XCENT,YCENT
Timer=0
For RADIOY=200 To 0 Step -20
   Proc CIRCULO[0,(2*Pi#),RADIOX,RADIOY]
Next
RADIOY=200
Proc CIRCULO[0,(0.5*Pi#),RADIOX,RADIOY]
For RADIOX=200 To 0 Step -20
   Proc CIRCULO[(0.5*Pi#),(2.5)*Pi#,RADIOX,RADIOY]
Next
TI=Timer
Hide
Clear Key
Wait Key
Cls 0
Show
Rem **** AHORA PRESENTAMOS LA TRAYECTORIA SIN USAR LAS FUNCIONES ****
N=(D-Start(2))/4 : Rem Calculamos el número de pasos
Plot 520,256 : Rem Situamos el puntero gráfico en las coordenadas iniciales
D=Start(2)
Timer=0
For P=1 To N
   X=Deek(D) : Y=Deek(D+2) : D=D+4
   Draw To X,Y
   X Mouse=X Hard(X)
   Y Mouse=Y Hard(Y)
Next
T2=Timer
Default
Print "Tiempo usando las funciones: ";T1
Print "Tiempo sin usar las funciones: ";T2
Print : Print "Expresados en 1/50 de segundo"
Procedure CIRCULO[AI#,AF#,RADIOX,RADIOY]
   For ANGULO#=AI# To AF# Step(2*Pi#)/100
      Rem **** CALCULAMOS LAS COORDENADAS X e Y ****
      X=XCENT+RADIOX*Cos(ANGULO#)
      Y=YCENT-RADIOY*Sin(ANGULO#)
      Draw To X,Y
      Rem **** COLOCAMOS EL RATON EN ESE PUNTO ****
      X Mouse=X Hard(X)
      Y Mouse=Y Hard(Y)
      Rem **** ALMACENAMOS LAS COORDENADAS EN LA TABLA ****
      Doke D,X : Doke D+2,Y : D=D+4
   Next
End Proc

Volver menú revistas Volver página anterior