164 Funciones AMAL ============== =XM Devuelve la coordenada X del raton =YM Devuelve la coordenada Y del raton =K1 Status de la tecla izquierda del raton (-1 =pulsada) =K2 Status de la tecla derecha =J0 Chequea joystick derecho. =J1 Chequea joystick izquierdo. Vease comando JOY =Z(n) Numero aleatorio. Devuelve un numero aleatorio entre -32767 y 32768. Este numero puede limitarse a un rango especifico usando una mascara-BIT N. Una operacion lo- gica AND se realizara entre el numero aleatorio y la mascara para generar el resultado final. Asi, estable- ciendo N en un valor de 255, nos aseguraremos que los numeros oscilaran entre 0 y 255. Una vez que esta fun- cion haya sido optimizada por velocidad, el numero de- vuelto no sera totalmente aleatorio. Si realmente nece sitas numeros aleatorios, seria mejor generar valores numericos con la funcion Basic RND y luego cargarlos en un registro externo de AMAL con la funcion AMREG. =XH(s,x) Convierte la coordenada de pantalla X en otra coorde- nada hardware =YH(s,y) Convierte una coordenada de pantalla Y en formato hard ware =XS(s,x) Conversion de coordenadas hardware a pantalla =YS(s,y) Conversion de coordenadas hardware a pantalla =BC(n,s,e) Chequea colisiones entre bobs. BC es identico a la ins truccion equivalente de AMOS Basic BOB COL. Chequea el bob numero N para colisiones entre los bobs S hasta E. Si se detecta una colision, BC devolvera un valor de -1, de otro modo sera 0. Esta instruccion no puede ser ejecutada dentro de una interrupcion. Asi solo es dis- ponible cuando estes ejecutando tus rutinas AMAL direc tamente desde el Basic con la instruccion SYNCHRO. =SC(n,s,e) Equivalente a la funcion SPRITE COL. Como la funcion BC, solo se permite usar conjuntamente con la instruc cion SYNCHRO. =V(v) VU-meter. La funcion VU muestra uno de los canales de sonido y devuelve la intensidad de la voz actual. Este es un numero que oscila entre 0-255. Puedes usar esta informacion para animar objetos a la vez que la musica Vease tambien la funcion VUMETER de AMOS Basic. 165 Control de programas AMAL desde el Basic ======================================== AMAL ON/OFF (empieza/detiene un programa AMAL) AMAL ON ¡n¿ Una vez que hayas definido tu programa AMAL, necesitaras ejecutar lo usando el comando AMAL ON. Este activa el sistema AMAL y empie za tu programa desde la primera instruccion. AMAL ON activa todos tus programas. El parametro opcional "N" te permite iniciar una rutina en un determinado tiempo. AMAL OFF ¡n¿ Detiene uno o todos los programas AMAL de su ejecucion. Esos pro gramas se reiniciaran cuando se desee redefiniendolos de nuevo con una llamada al comando AMAL. AMAL FREEZE (congela temporalmente un programa AMAL) AMAL FREEZE ¡n¿ Detiene la ejecucion de uno o mas programas AMAL. Tus programas podran reinicializarse en cualquier momento, usando una simple llamada AMAL ON. Advierte que esta instruccion debera ser siempre usada para detener a AMAL antes de que se ejecute un comando como DIR, de otro modo surgiran alteraciones visuales. = AMREG = (da el valor de un registro externo AMAL) r=AMREG (n,¡channel¿) AMREG(n,¡channel¿)= expression Esta funcion te permite acceder al contenido de los registros in- ternos y externos de AMAL, de forma directa desde el Basic. "N" es el numero del registro. Los valores posibles van desde 0 a 25, el 0 representa al RA y el 25 al RZ. Utilizando el parametro opcional "channel" podras hacer refe- rencia a cualquier registro interno de AMAL. En este caso, "N" va de 0 a 9, representando de R0 a R9. Los siguientes ejemplos muestran como es posible recuperar la posicion X del sprite actual desde el Basic: Load "AMOS_DATA:Sprites/Octopus.abk":Get sprite palette Channel 1 to Sprite 8: Sprite 8,100,100,1 A$="Loop: Let RX=X+1 ; Let X+RX ; Pause ; Jump Loop" Amal 1,A$: Amal On : Curs Off Do Locate 0,0 Z=ASC("X")-65: Rem advierte el uso de ASC para obtener el registro pt Print Amreg(ASC("X")-65) Loop 166 AMPLAY (controla una animacion originada por PLay) AMPLAY tempo,direction (¡start to end¿) Cualquier secuencia de movimiento que hayas producido mediante el comando PL de AMAL se controla a traves de los registros internos R0 y R1. A cada objeto se le asignara su propio juego de regis- tros AMAL. Asi, si estas animando varios objetos, a menudo necesi taras cargar un numero de esos registros con exactamente los mis- mos valores. Pese a que esto puede solucionarse utilizando la funcion AMREG obviamente es mucho mas facil si fuera posible realizarlo median- te un simple instruccion que te permita cambiar R0 y R1 para la totalidad de objetos que se muevan a la vez. Este es el proposito del comando AMPLAY. AMPLAY contiene el "tempo" y la "direccion" de tus movimientos y los carga en los registros R0 y R1 en los canales seleccionados "TEMPO" controla la velocidad de tus objetos en pantalla. Estable ce un retraso (en cincuentavos de segundo) entre cada paso sucesi vo del movimiento. "DIRECCION" cambia la direccion del movimiento He aqui una lista con las diferentes opciones: Valor Direccion ----- --------- >0 Mueve el objeto seleccionado en la direccion ori- ginal del movimiento 0 Invierte el movimiento y desplaza hacia atras al objeto -1 Aborta el modelo de movimiento y salta a la sigui ente instruccion de tu secuencia de animacion AMAL Por defecto, esta instruccion afectara a todos los canales de animacion. Esto puede evitarse añadiendo los parametros especifi- cos "start" y "end". "START" es el numero de canal del primer ob- jeto a modificar y "END" contiene el numero de canal asignado al ultimo objeto a modificar. Ten en cuenta que tanto el "tempo" co- mo la "direccion" pueden ser omitidos si se desea. Ejemplos: Amplay ,0 : Rem invierte tus objetos Amplay 2, : Rem ralentiza tu patron de movimientos Amplay ,-1, 3 to 6 : Rem detiene el movimiento de los cana- les 3, 4, 5 y 6 = CHANAN (testea una animacion AMAL) s=CHANAN(channel) Esta es una simple funcion que chequea el status de una secuencia de animacion AMAL y devuelve -1 (cierto) si esta actualmente acti va o 0 (falso) si ya hubiera sido ejecutada. "CHANNEL" contiene el numero del canal a ser chequeado. 167 = CHANMV (chequea si un objeto esta aun en movimiento) s= CHANMV(channel) Devuelve un valor de -1 si el objeto especificado por "channel" esta actualemente en movimiento, en caso contrario sera 0 (Falso) Este comando puede usarse conjuntamente con la instruccion Move de AMAL para chequear si una secuencia de movimiento ha agotado todos sus pasos. Ahora podras volver a empezar la secuencia en la nueva posicion con una cadena de movimiento mas apropiado si fue ra necesario. Ejemplo: Load "AMOS_DATA:Sprites/Monkey_right.abk":Get Sprite Palette Sprite 9,150,150,11 M$=Move 300,150,150 ; Move -300,-150,75" Amal 9,M$ :Amal on While Chanmv (9) Wend Print "Movimiento completo" Errores de AMAL =============== = AMALERR (devuelve la posicion de un error) p=AMALERR Devuelve la posicion en la actual cadena de animacion donde se ha producido un error. Una inspeccion cuidadosa de esta cadena te permitira rapidamente corregir tus errores. Ejemplo: Load "AMOS_DATA:Sprites/Octopus.abk" Sprite 8,100,100,1 A$="L: IF X=300 them Jump L else X=X+1 ; Jump L" Amal 8,A$ Este programa generara un mensaje de error de sintaxis porque IF sera interpretado como dos instrucciones, a saber I y F. Para encontrar la posicion dentro de la cadena de animacion de este error, teclea la siguiente instruccion desde la ventana directa: Print Mid$(A$,Amalerr,Amalerr+5) 1- Mensajes de error Si cometes un error en alguno de tus programas AMAL, AMOS re- gresara al Basic mostrando un apropiado mensaje de error. He aqui una completa lista de dichos errores que pueden ser generados por este sistema, junto con una explicacion de sus causas mas frecuen tes: 168 Bank not reserved: Este error aparece cuando intentas llamar a la instruccion PLay sin haber cargado primero un banco de memoria conteniendo los datos del movimiento. Este banco puede crearse mediante un programa accesorio de AMAL. Si no se debe a PLay, en- tonces comprueba que hayas separado correctamente instrucciones como Pause y Let. Instruction only valid in Autotest: Has llamado por despite al modo Direct o la instruccion eXit. Illegal instruction in Autotest: El autotest solo podra usarse en conjuncion con ciertos comandos AMAL. No es posible mover o ani- mar nuestros objetos de cualquier forma dentro de un autotest. Asi que debes buscar comandos erroneos del tipo Move, Anim o un For...Next. Jump To/Within Autotest in animation string: Los comandos dentro de una funcion autotest estan completamente separados de tu pro- grama principal AMAL. Asi AMAL no te permitira saltar directamen- te a un procedimiento de autotest. Para abandonar un autotest y regresar a tu programa principal AMAL, debes usar los comandos eXit o Direct. Label already defined in animation string: Has intentado definir la misma etiqueta dos veces en tu programa AMAL. Todas las etique tas AMAL se componen de solo una letra mayuscula. Asi "Test" y "Total" son dos versiones de la misma etiqueta "T". Este error se generara tambien si separas accidentalmente dos instrucciones por un par de puntos (:). Sera mejor que utilices el punto y coma. Label not defined in animation string: Este error se genera cuan- do intentas saltar a una etiqueta que no ha sido definida previa- mente en tu cadena de animacion. Next without For in animation string: Como su equivalente Basic, cada comando For debe ser igualado por su correspondiente Next. Comprueba todos los bucles, especialmente los anidados, en busca del Next sobrante. Syntax error in animation string: Has cometido un error al tecle- ar alguna de tus cadenas de animacion. Es facil cometer este tipo de errores de forma accidental al teclear una instruccion AMAL, como ocurre con su equivalente Basic. Canales de animacion ==================== AMOS te permite ejecutar hasta 64 programas AMAL distintos y de forma simultanea. Cada programa sera asignado a un canal espe- cifico de animacion. Solo los primeros 16 canales pueden ser eje- cutados mediante interrupciones. Si necesitas animar mas objetos, tendras que apagar las interrupciones usando el comando SYNCHRO OFF. Podras ahora correr los programas AMAL paso a paso usando una explicita llamada al comando SYNCHRO en el bucle del programa principal. Por defecto, todos los canales de interrupcion se asig nan al sprite hardware relevante. 169 CHANNEL (asigna un objeto a un canal AMAL) CHANNEL n TO object s El comando CHANNEL asigna un canal de animacion a una pantalla en particular "object". En AMAL, no tendras restricciones para un solo canal por objeto. Cualquier simple pantalla puede ser fiel- mente animada con varios canales si fuera necesario. Existen va- rias formas de esta instruccion. 1- Animacion de un sprite computerizado CHANNEL n TO SPRITE s Este comando asigna el sprite numero s al canal n. Por defecto, los canales 0-7 son automaticamente reservados para sus sprites hardwares equivalentes, mientra que los canales 8-15 se reservan para los apropiados sprites computerizados. Al objeto de animar los sprites computerizados del 16 en ade- lante, necesitaras posicionarlos directamente en un canal de ani- macion mediante el comando CHANNEL. Como es normal, los numeros de sprite 8-63 especifican sprites computerizados en vez de spri- tes hardware. Por ejemplo: Channel 5 to sprite 8: Rem anima el sprite computerizado 8 utilizando el canal 5 Los registros X e Y de tu programa AMAL, ahora se refieren a las coordenadas hardware del sprite seleccionado. De forma simi- lar la imagen del sprite actual se almacena en el registro A. 2- Animacion de un bob CHANNEL n TO BOB b Posiciona un bob en el canal de animacion "N". Este objeto sera considerado de forma identica al caso anterior. La unica diferen- cia radica en que los registros X e Y ahora contienen la posicion del bob en coordenadas de pantalla. Ten en cuenta que si has activado el "switching" de pantalla con el comando DOUBLE BUFFER, este sera usado automaticamente para todas las animaciones de bobs. 3- Moviendo una pantalla AMOS Basic te permite posicionar libremente la pantalla actual en cualquier lugar de tu monitor. Normalmente esto se controla con la instruccion SCREEN DISPLAY. Sin embargo, a veces es util ser capaz de mover la pantalla mediante interrupciones: 170 CHANNEL n TO SCREEN DISPLAY d Este comando establece un canal "N" para la pantalla numero "D". La pantalla D puede ser definida en cualquier parte de tu progra- ma. Solo se producira un error si la pantalla no ha sido abierta cuando comiences la animacion. Las variables X e Y de AMAL, ahora contienen la posicion de tu pantalla en coordenadas hardware. El registro A NO sera utilizado por esta opcion y por tanto no podras animar pantallas mediante Anim. Por otro lado, todas las instrucciones estandards de AMAL se ejecutaran normalmente. Podras facilmente usar este sistema para "botar" el dibujo a lo largo del monitor. Ejemplos: Load IFF "AMOS_DATA:IFF/Frog_Screen.IFF",1 Channel 0 to screen display 1 Amal 0, "Loop: Move 0,200,100 ; Move 0,-200,100 ; Jump Loop" Amal On 0: Direct Load IFF "AMOS_DATA:IFF/Frog_Screen.IFF",1 Channel 0 to screen display 1 :Rem la pantalla solo puede mostrarse en ciertas coordenadas X Amal 0,"Loop: Let X=XM ; Let Y=YM ; Pause ; Jump Loop" Amal On: Direct 4- Scrolling mediante Hardware Pese a que el scrolling puede realizarse mediante el comando SCREEN OFFSET de AMOS Basic, es a menudo mas facil, animar tus pantallas usando AMAL, ya que este produce un efecto mucho mas suave. CHANNEL n TO SCREEN OFFSET d Esto asigna el programa AMAL numero N a la pantalla d, para la realizacion de un scrolling. Los registros X e Y ahora se referi- ran a la seccion de pantalla que sera mostrada en tu monitor. Si cambias esos registros se producira un scroll de la pantalla visi ble a lo largo de tu monitor. He aqui un ejemplo: Screen Open 0,320,500,32,lowres: Rem abre pantalla extralarga Screen Display 0,,45,320,250 Load Iff "AMOS_DATA:IFF/Magic_screen.IFF" Screen copy 0,0,0,320,250 TO 0,0,251 Screen 0: Flash off: Get Palette (0) Channel 0 to Screen Offset 0 Amal 0,"Loop:Let X=XM-128 ; Let Y=YM-45 ; Pause ; Jump Loop" Amal On: Wait Key Este programa te permite realizar un scroll de la pantalla uti lizando para ello el raton. Intenta mover el raton en modo direc- to. 171 5- Cambio del tamaño de pantalla CHANNEL n TO SCREEN SIZE s Esto te permitira cambiar el tamaño de la pantalla utilizando pa- ra ello AMAL. "S" es el numero de la pantalla que va a ser manipu lada. Los registros X e Y ahora controlan la anchura y altura de la pantalla respectivamente. Son similares a los parametros W y H usados en el comando SCREEN DISPLAY. Ejemplo: Load Iff "AMOS_DATA:IFF/Magic_screen.IFF",0 Channel 0 TO screen size 0 Screen Display 0,,,320,1: Rem establece tamaño pantalla en 1 A$="Loop: For R0=0 To 255 ; Let Y=R0 ; Next R0; " A$=A$+"For R0= 0 To 254; Let Y=255-R0; Next R0; Jump Loop" Amal 0,A$: Amal On: Direct 6- Arcos iris CHANNEL n TO RAINBOW r Esta opcion genera un efecto de arco iris dentro de un programa AMAL. Como es habitual, "N" es el numero del canal de animacion de 0 a 63. "R" es un numero de identificacion de tu arco iris (Va de 0 a 3). X contiene la BASE actual de tu arco iris. Este es el primer color de la paleta de tu arco iris que aparecera. Cambiandolo, este aparecera al reves. Y contiene la linea de pantalla en la que el efecto arco iris tendra comienzo. Si cambias este valor, el efecto arco iris se movera de arriba a abajo. Todas las coorde nadas se miden en formato Hardware. El registro A almacena la altura de tu arco iris en pantalla. Vease el comando Basic RAINBOW para mas detalles. Tecnicas avanzadas ================== 1- El sistema AUTOTEST Normalmente todos los programas AMAL se ejecutan en estricto orden desde el comienzo hasta el final. Inevitablemente algunos comandos como Move y For...Next requieren varios segundos para su realizacion. Pere a esto, en la mayoria de los casos no se produ- cen retrasos considerables en la ejecucion de los programas. Mira el siguiente ejemplo: Load "AMOS_DATA:Sprites/Octopus.abk": Get Sprite Palette Sprite 8,130,50,1 Amal 8,"Loop: Let R0=XM-X ; Let R1=YM-Y ; Move R0,R1,50 ; J L" Amal On: Direct 172 Cuando muevas el raton, se supone que el sprite seguira este movimiento a lo largo de la pantalla. Sin embargo, en realidad la respuesta es bastante perezosa, debido a que los nuevos valores de XM y de YM se introducen solo despues de que el movimiento del sprite haya concluido. Intenta mover el raton en circulos. Ahora el pulpo esta completamente despistado. AUTOTEST resuelve este problema realizando tus tests al princi pio de cada VBL y antes de continuar con el programa principal. Tus tests se producen ahora a intervalos regulares de cincuentavo de segundo, obteniendo una respuesta practicamente instantanea. 2- Comandos de AUTOTEST La sintaxis de Autotest es la siguiente: * AUtotest (test) Puede consistir en cualquiera de los siguientes comandos AMAL * Let reg=exp Esta es la instruccion AMAL estandard. Asigna el resultado de una expresion al registro reg. * Jump label Este comando salta a otra parte del actual autotest. "Label" se define mediante dos puntos (:) y debe incluirse dentro del parentesis del autotest * eXit Abandona el autotest y regresa al programa principal. * Wait Desactiva completamente el programa AMAL, y solo ejecuta el autotest * If Al objeto de simplificar el proceso de testeo dentro de una ru tina de autotest, contamos con una version del comando If que ya vimos en AMAL. Esto te permite tomar alguna decision dependiendo del resultado de la expresion logica "exp": - If exp Jump L (salta a otra parte de autotest) - If exp Direct L (Elige parte del programa a ejecutar tras AU) - If exp eXit (Abandona el autotest -AU-) * On Reinicia el programa principal despues de una instruccion pre- via WAIT. Esto te permite esperar algun acontecimiento como pul- sar el raton, sin recurrir el procesador de tiempo. * Direct label Este comando cambia el punto en donde el programa principal con tinuara despues de un autotest. AMAL saltara automaticamente a ese punto en el siguiente VBL. Ten presente que debe ser defini- do fuera del parentesis del autotest. 173 3- Autotest Interno He aqui el ejemplo anterior reescrito utilizando el procedi- miento de Autotest Load "AMOS_DATA:Sprites/Octopus.abk" Sprite 8,130,50,1: Get Sprite Palette A$="AUtotest (If R0 <> XM Jump Update" A$=A$+"If R1 <> YM Jump Update else eXit" A$=A$+"Update: Let R0=XM ; Let R1=YM ; Direct M)":Rem Final AU A$=A$+"M: Move R0-X, R1-Y, 20 Wait;": Rem cambia el valor 20 Amal 8,A$: Amal On Ahora el sprite lentamente seguira al raton, no importa a la velocidad que lo muevas. La accion de este programa es la siguien te: cada cincuentavo de segundo las coordenadas del raton son com probadas mediante las funciones XM e YM. Si no se cambian hasta el ultimo test, el AUtotest se desactiva mediante el comando eXit El programa principal continuara precisamente donde se abandono. Sin embargo, el raton ha sido movido, la rutina de autotest reiniciara el programa principal otra vez desde el principio (la- bel M) usando las nuevas coordenadas de XM e YM respectivamente. Consideraciones sobre el tiempo =============================== UPDATE EVERY (reserva parte del tiempo para tus programas Basic) UPDATE EVERY n Pese a que la mayoria de programas AMAL se ejecutan de forma casi instantanea, ciertos objetos que se manipulan necesitan ser expli citamente dibujados en la pantalla del Amiga. La cantidad de tiempo requerido para este proceso de actualiza- cion es impredecible y puede variar durante el curso de tu progra ma. Esto puede ocasionar un desagradable temblor en los patrones de movimiento de ciertos objetos. El comando UPDATE EVERY ralentiza el proceso de actualizacion de forma que incluso el mayor objeto pueda dibujarse durante una sola fase de actualizacion. Esto regula el sistema de animacion y genera agradables y suaves efectos de movimiento. "N" es el numero de VBL entre cada actualizacion de pantalla. En la practica podra comenzar con un valor de 2, y aumentarlo gra dualmente hasta suavizar el movimiento. Un util efecto colateral de este comando es que reserva tiempo para la realizacion de tu programa en Basic. Con un uso razonable de esta instruccion, es posible a veces, acelerar tus programas hasta un 30% sin afectar la suavidad de tus secuencias de anima- cion. 174 Superando el limite de 16 objetos ================================= SYNCHRO (ejecuta directamente un programa AMAL) SYNCHRO ¡ON/OFF¿ Normalmente AMOS Basic te permitira ejecutar hasta 16 diferentes programas AMAL de forma simultanea. Este limite es debido por la velocidad general que permite el Hardware del Amiga. Cada progra- ma de AMAL tiene su propia parte del procesador de tiempo. Asi si estas utilizando el sistema estandard de interrupciones, habra tiempo suficiente para ejecutar alrededor de 16 programas por se- parado. El comando SYNCHRO te permite sobrepasar esta limitacion al ejecutar programas AMAL directamente desde el Basic. Gracias al uso de las interrupciones, todos los programas AMAL se ejecutaran mediante una simple llamada al comando SYNCHRO. Dado que los pro- gramas AMAL se ejecutan mucho mas rapidos que las rutinas en Ba- sic, tus animaciones apareceran deliciosamente suaves. Y ahora podras decidir cuando y donde deseas que se realicen las rutinas AMAL dentro de tus programas. Otra ventaja adicional es que ahora puedes incluir comandos de deteccion de colisiones como BOB COL y SPRITE COL directamente en tus rutinas AMAL. Puesto que dichos comandos no estaban permiti- dos dentro del sistema de interrupciones puesto que ellos hacen uso del chip BLITTER del Amiga, y esto seria imposible si estuvie ramos usando interrupciones. Antes de llamar a SYNCHRO, primero necesitaras apagar las inte rrupciones mediante SYNCHRO OFF. Es importante hacer esto antes de definir tus programas AMAL, pues de otro modo no seria posible usar numeros de canal superiores a 15 a menos que desearamos obte ner un mensaje de error. Debido a la potencia del sistema de animacion, es casi posible escribir programas arcade completamente en AMAL. Dejando a la pro gramacion en Basic para las pequeñas tareas como el manejo de la tabla de records y la carga de las ondas de ataque desde el disco El resultado sera indistinguible del codigo maquina. Un buen ejem plo lo constituye CARTOON CAPERS, el primer juego comercial com- pletamente escrito con AMOS. 175 Comandos de animacion STOS-compatibles ====================================== El Basic original STOS incluia un potente sistema de animacion que permitia mover los sprites usando complejos patrones de movi- miento mediante interrupciones. Con el paso del tiempo, dichos co mandos se hicieron muy populares. Pese a que hoy en dia han sido superados por el sistema AMAL, ellos nos permiten una simple introduccion a la animacion en el Amiga. Asi AMOS quiere ofrecerte todo el sistema de animacion de STOS como un complemento extra. Si pretendes convertir programas STOS en AMOS, necesitaras sa- ber los siguientes puntos: - A diferencia de STOS, los patrones de movimiento en AMOS Basic se asignan al canal de animacion que tu desees. Los comandos M (Move) pueden usarse para mover bobs, sprites o pantallas, y siempre usando la misma tecnica. Por defecto, todos los canales de animacion son asignados a los sprites hardware equivalentes. En la practica, encontraras mas facil sustituir bobs por los sprites estandards de STOS. No olvides llamar al DOUBLE BUFFER durante el proceso de ini- cializacion, so pena de obtener un movimiento tembloroso de tus bobs. - El mismo canal puede ser usado para los programas de animacion de STOS Y AMAL. Asi es facil ejecutar tus programas, una vez que han sido traducidos a AMOS Basic. El orden de ejecucion es: AMAL MOVE X MOVE Y ANIM MOVE X (mueve un sprite horizontalmente) MOVE X n,m$ Define un listado de movimientos horizontales que sera ejecutados seguidamente en el canal de animacion numero "N". N puede oscilar desde 0 a 15 y se refiere a un objeto que has asignado previamen- te mediante el comando CHANNEL. "m$" contiene una secuencia de instrucciones que juntas determinan tanto la velocidad como la di reccion de tu objeto. Esos comandos se encierran entre parentesis y se introducen siguiendo el formato: (speed,step,count) No existe limite para el numero de comandos que quieras incluir en una cadena simple de movimiento, sino la cantidad de memoria disponible. "Speed" determina un retraso en cincuentavos de segun do entre cada sucesivo paso del movimiento. La velocidad puede va riar desde 1 (muy rapido) hasta 3276 (increiblemente lento). 176 "Step" especifica el numero de pixels que se movera el objeto durante cada operacion. Si el paso es positivo, el sprite se move ra a la derecha, y si es negativo, lo hara a la izquierda. La velocidad aparente del objeto depende de una combinacion de "speed" y "step". Grandes desplazamientos con una velocidad mode- rada producira un rapido movimiento del objeto pero lo hara de forma temblorosa a lo largo de la pantalla. De forma parecida, un tamaño de paso pequeño, combinado con una alta velocidad tambien movera rapidamente el objeto, pero el movimiento sera mucho mas suave. Las velocidades mas rapidas deben obtenerse con desplaza- mientos de 10 o -10. "Count" determina el numero de veces que el movimiento se repe- tira. Los valores posibles van desde 0 hasta 32767. Un valor de 0 ejecuta el patron de movimientos de forma indefinida. Por añadidura al comando anterior, podras adjuntar cualquiera de estas instrucciones al final de tu cadena de movimiento. Pero la mas importante de todas es la instruccion "L" (por Loop), que regresa al principio de la cadena y la ejecuta de nuevo por com- pleto. Ejemplo: Load "AMOS_DATA:Sprites/Octopus.abk": Get Sprite Palette Sprite 1,130,100,1: Rem define el sprite 5 Move X 1,"(1,5,60)(1,-5,60)L" Move On La opcion E te permite detener tu objeto cuando este alcance un punto concreto de la pantalla. Cambia la tercera linea del ejem- plo anterior por Move X 1,"(1,5,30)E100" Ten en cuenta que ese punto final funcionara solo si la coordena da X del objeto alcanza exactamente el valor designado original- mente en la instruccion. Si este valor fuera incrementado, el ob- jeto continuara su movimiento pese a haber sobrepaso el punto final, y el test fallara. Ejemplo: Load "AMOS_DATA:Sprites/Octopus.abk": Get Sprite Palette Channel 1 to Sprite 8: Channel 2 to Sprite 10 Print At(0,5)+"Looking OK" Sprite 8,130,100,1 Move X 1,"(1,10,30)(1,-10,30)L" Move On Print At(0,10)+"Now press a key": Wait Key Sprite 10,140,150,2 Move X 2,"(1,15,20)L": Move On 2 Print At(0,15)+"Oh Dear!":Wait Key 177 MOVE Y (Mueve un objeto verticalmente) MOVE Y n,m$ Este instruccion complementa al comando anterior al capacitarte para mover un objeto verticalmente a lo largo de la pantalla. Co- mo antes, "N" se refiere al numero de una secuencia de animacion que tu has posicionado con el comando CHANNEL, y que oscila entre 0 y 15. "m$" contiene una cadena de movimiento con un formato identico al caso anterior. Los desplazamientos positivos ahora correspon- den a un movimiento de bajada, mientras que los valores negativos originan un movimiento hacia arriba. Ejemplo: Load "AMOS_DATA:Sprites/Octopus.abk": Get Sprite Palette Channel 1 to sprite 8: Sprite 8,130,10,1 Move Y 1,"10(1,1,180)L" Channel 2 to screen display 0 Move Y 2,"(1,4,25)(1,-4,25)" Move On: Wait Key MOVE ON / OFF (inicia/detiene un movimiento) MOVE ON/OFF ¡n¿ Antes que tu patron de movimientos haya sido ejecutado, primero debera activarse mediante el comando MOVE ON. "N" hace referencia a la secuencia de animacion que deseas co- menzar, y puede oscilar de 0 a 15. Si fuera omitido entonces la totalidad de tus movimientos seran activados simultaneamente. MOVE OFF tiene exactamente el efecto opuesto: detiene la ac- tual secuencia de movimiento. MOVE FREEZE (suspende temporalmente los movimientos de un sprite) MOVE FREEZE ¡n¿ Este comando detiene temporalmente el movimiento de uno o mas ob- jetos en pantalla. Esos objetos pueden volver a moverse de nuevo mediante el comando MOVE ON. "N" es completamente opcional y especifica el numero de un ob- jeto simple que sera afectado por esta instruccion. = MOVON (devuelve el status de movimiento) X=MOVON(n) MOVON chequea si un objeto en particular esta siendo movido por las instrucciones MOVE X y MOVE Y. Devolvera un valor -1 si el ob jeto esta en movimiento, y 0 si estuviera estacionario. No confun dirlo con el comando MOVE ON. Ten en cuenta tambien que MOVON bus ca los patrones de movimiento generados mediante el comando MOVE, asi que no detectara ninguna animacion generada por AMAL. 178 ANIM (anima un objeto) ANIM n,a$ Hace que un objeto entre en una secuencia de imagenes que produce un suave efecto de animacion en pantalla. Esas animaciones se eje cutan 50 veces por segundo, mediante el uso de interrupciones, de modo que pueden realizarse de forma simultanea con tus programas Basic. "N" es el numero de canal en el que un sprite o bob especifico sera animado por esta instruccion. "a$" contiene una serie de ins trucciones que definen tu secuencia de animacion. Cada operacion se divide en 2 componentes separados, encuadrados entre parente- sis. "Image" es el numero de la imagen que sera mostrada durante cada fase de la animacion. "Delay" especifica la cantidad de tiem po que esta imagen aparecera detenida en pantalla (en unidades de cincuentavos de segundo). Ejemplo: Load "AMOS_DATA:Sprites/Octopus.abk": Get Sprite Palette Channel 1 to sprite 8: Sprite 8,200,100,1 Anim 1,"(1,10)(2,10)(3,10)(4,10)" Anim On: Wait Key Como en la instruccion MOVE, existe tambien una orden L que te capacita para repetir tus animaciones continuamente. Asi, basta con cambiar el comando ANIM en el ejemplo previo por el siguiente Anim 1,"(1,10)(2,10)(3,10)(4,10)L" ANIM ON/OFF (inicia una animacion) ANIM ON/OFF ¡n¿ Este comando activa una serie de animaciones que han sido previa- mente creadas mediante el comando ANIM. "N" especifica el numero de una secuencia individual de animacion para ser inicializada. Si esta fuera omitida, entonces todas las actuales secuencias de animacion se inicializarian simultaneamente. ANIM OFF ¡n¿ Detiene una o mas secuencias de animacion iniciadas previamente con ANIM ON. ANIM FREEZE (congela una animacion) ANIM FREEZE ¡n¿ Congela temporalmente la actual secuencia de animacion en panta- lla. "N" elige una simple secuencia de animacion a ser suspendida Si no es incluyera, entonces todas las animaciones se veran afec- tadas. Dichas animaciones podran volver a ejecutarse con una sim- ple llamada a la instruccion ANIM ON.