122 11: S P R I T E S H A R D W A R E Una de mayores atracciones del AMIGA es su capacidad para pro ducir juegos de alta calidad que incluso compiten con las genui- nas maquinas de Arcade tradicionales. Esto puede ser ampliamente demostrado por terrorificos juegos como Battle Squadron y Elimina tor. Ahora, por vez primera, todas esas posibilidades estan en la punta de tus dedos¡¡¡¡. AMOS Basic te ofrece un control completo sobre el Hardware del AMIGA y de los sprites. Dichos sprites son manipulados sin dificultad mediante el lenguaje de animacion AMAL sin necesidad de complejos lenguajes de codigo maquina, de forma que podras facilmente crear tus propios programas de Arcade. Los sprites Hardware son imagenes separadas que pueden ser au- tomaticamente sobrepuestas en la pantalla del Amiga. El clasico ejemplo de Sprite Hardware es el puntero del raton. Este es com- pletamente independiente de la pantalla, y funciona exactamente igual en los diferentes modos graficos del Amiga. Puesto que los sprites no interfieren con el fondo de la panta lla, son ideales para los objetos moviles que aparecen en los jue gos del tipo Arcade. No solo son fugazmente rapidos, sino que tam bien ocupan muy poca memoria. Asi que cuando estes escribiendo un programa Arcade, los sprites Hardware siempre deben ser incluidos en tus listados. Cada sprite presenta 16 pixels de anchura por 255 de alto. El Hardware del Amiga soporta un maximo de 8 sprites tricolores o 4 de 15 colores. El numero de color 0 es transparente, esta es la razon de la extraña distribucion de colores. A primera vista, estas posibilidades no parecen especialmente importantes. Pero existen un par de trucos que pueden incrementar el numero y tamaño de esos sprites hasta hacerlos irreconocibles. Una solucion es tomar cada sprite Hardware y dividirlo en seg mentos horizontales. Esos segmentos pueden ser independientemente posicionados, permitiendote mostrar, aparentemente, docenas de sprites en pantalla al mismo tiempo. De forma parecida, la res- triccion de anchura puede ser excedida si construimos un objeto en varios sprites individuales. Usando esta tecnica es muy facil generar objetos de mas de 128 pixels de anchura. Hasta hace poco, la unica forma de explotar esas tecnicas era a traves de misteriosos codigos del lenguaje ensamblador del pro- cesador 68.000 del Amiga. Pero ahora te deleitaras con las posibi lidades que te ofrece AMOS Basic para manejar todo este proceso de forma automatica. Una vez que hayas diseñado tus sprites con el editor de sprites de AMOS, podras manipularlos sin dificultad con solo una instruccion Basic. 123 Los comandos de sprites ======================= Recuerda que debes tener un banco de sprites cargado en memo- ria cuando intentes ejecutar alguno de los comandos descritos en este capitulo. Te recomendamos que uses el fichero SPRITES.ABK que se encuentra en tu disco AMOS. SPRITE (Muestra un sprite Hardware en pantalla) SPRITE n,x,y,i El comando muestra un sprite Hardware en pantalla en las coordena das X e Y, usando la imagen numero I. "N" es el numero de identificacion del sprite en pantalla y puede oscilar desde 0 hasta 63. Cada sprite puede estar asociado con una imagen por separado del banco de sprites, asi la misma imagen puede ser usada para varios sprites. "X" e "Y" contienen la posicion del sprite, utilizando para ello coordenadas Hardware. Todas las medidas son tomadas del "HOT SPOT" o centro de tus imagenes. Esto sirve como un tipo de manejo del sprite y se usa como punto de referencia para las coordenadas Normalmente, el "hot spot" se establece en la esquina superior izquierda de una imagen. Sin embargo, esto puede cambiarse dentro de tu programa usando el comando HOT SPOT. Las coordenadas Hardware son independientes del modo de panta- lla y comienzan en -129,-45 de la pantalla por defecto. AMOS te permite varias funciones para conversion de coordenadas Hardware y coordenadas de pantalla. Observa para ello las funciones X HARD Y HARD, X SCREEN y Y SCREEN para mas detalles. "I" es el numero de una imagen particular almacenada en el ban co de sprites. Este banco puede ser creado utilizando el editor de sprites de AMOS, y se graba automaticamente con tu programa en Basic. Tambien puede ser cargado directamente con la instruccion LOAD. Ademas, puedes usar el comando GET SPRITE para grabar una imagen justo sobre la pantalla actual. Cualquiera de los parametros anteriores (X,Y,I) pueden ser omi tidos de forma opcional, pero en su lugar deberan aparecer las co mas apropiadas. Por ejemplo: Load "AMOS_DATA:Sprites/Octopus.abk" Sprite 8,200,100,1 Sprite 8,,150,1 Sprite 8,300,, 124 Sprites computerizados ====================== Pese a que Amiga solo te facilita hasta 8 sprites, es posible usarlos para mostrar mas de 64 objetos en pantalla al mismo tiem- po. Esos objetos se conocen como "SPRITES COMPUTERIZADOS" y son completamente manejados por AMOS Basic. Los sprites computeriza- dos pueden ser asignados mediante el comando SPRITE, siempre con un numero mayor que 7. Por ejemplo: Load "AMOS_DATA:Sprites/Octopus.abk" Sprite 8,200,100,1 El tamaño de un sprite computerizado se toma directamente de la imagen de datos, y puede variar desde 16 hasta 128 pixels de anchura, y desde 1 hasta 255 pixels de altura. Antes de que hagas pleno uso de esos sprites necesitaras saber algo de los principios que se esconden tras ellos. Cada sprite Hardware contiene una estrecha banda de 16 pixels de anchura y 256 pixels de profundidad. Dependiendo del numero de colores, tu puedes tener 8 o 4 de esas bandas en pantalla al mismo tiempo. Deberia ser obvio que la mayor parte del area del area de esos sprites es desaprovechada. Y esto debido a que muy pocos progra- mas necesitan sprites de un tamaño mayor a 40x64 pixels. Ahora bien, esto nos permite hacer un truco que nos facilita ahorrar este espacio para generar docenas de sprites extras en pantalla. Observa el siguiente ejemplo, una banda que contiene 4 letras A,M,O y S: ----------------------------------- ¡ ¡ A ¡ ¡ ¡ ¡ M ¡ ¡ ¡ ¡ O ¡ ¡ ¡ ¡ S ¡ ¡ ----------------------------------- Este sprite puede ser dividido en 4 segmentos horizontales y cada uno de esos segmentos incluiria una letra. El Hardware del Amiga permite que cada seccion pueda ser libremente posicionada en cualquier lugar de la misma linea, dando lugar por tanto a 4 sprites computerizados. He aqui el diagrama que ilustra todo este proceso: ----------------------------------- ¡ ¡ A ¡ ¡ ----------------------------------- ¡ ¡ M ¡ ¡ ----------------------------------- ¡ ¡ O ¡ ¡ ----------------------------------- ¡ ¡ S ¡ ¡ ----------------------------------- Particion de 1 sprite Hardware en 4 sprites computerizados 125 Como puedes ver, un sprite computerizado es realmente una par- te de un sprite Hardware visualizado en una distinta posicion ho- rizontal de pantalla. Date cuenta de la linea que separa cada ob- jeto. Esta es una consecuencia inevitable del proceso anterior de reposicionamiento, y es generada por el Hardware del Amiga. Debido a la forma en la que se producen los sprites computeri- zados, hay un par de restricciones a su uso. Primeramente, no pue des tener mas de 8 sprites computerizados en una misma linea. En la practica, el sistema se complica por la necesidad de producir sprites que sean mayores del maximo de 16 pixels. AMOS genera esos objetos por posicionamiento automatico de varios sprites com puterizados cara a cara. El maximo de 8 sprites Hardware, ademas, impone un limite es- tricto al numero de tales objetos que tu puedes visualizar en una linea horizontal de pantalla. La anchura total de los objetos no puede exceder: a) 16*8 = 128 pixels para los sprites tricolores b) 16*4 = 64 pixels para los sprites de 15 colores Si intentas ignorar esta limitacion, no obtendras ningun men- saje de error, pero tu sprite computerizado no aparecera en la pantalla. Asi, es vital asegurarse que la anterior restriccion no se olvide nunca. Pero esto puede evitarse utilizando el siguiente procedimiento: Juntar las anchuras de todos los sprites computerizados, multi plicando las dimensiones de todos los sprites de 15 colores por 2 Si el total es mayor de 128, necesitaras espaciar los sprites en la pantalla al objeto de que su anchura conjunta sea menor que este valor. Ten un cuidado especial al animar tus sprites con AMAL, que ciertas combinaciones solo se conseguiran reducir cuan- do hayas experimentado con ellas durante algun tiempo. Esos pro- blemas apareceran por la desaparicion aleatoria de uno o mas spri tes en pantalla. En ultimo caso, necesitaras sustituir alguno de tus mayores sprites con el Blitter Objects. Esto aumentara el tamaño general de tu programa de forma significativa, pero sin afectar lo mas minimo la calidad final del programa. Esas restricciones no son exclusivas de AMOS, sino que se pue- den aplicar igualmente a cualquier otro programa de Amiga, inclu- so si estos estan completamente escritos en codigo maquina. De esta forma no hay nada que te impida el producir tu propio Xenon usando exactamente las mismas tecnicas. Por ultimo, no olvides que normalmente el sprite Hardware nume ro 0 se asigna al cursor del raton. Puedes activar este sprite con una simple llamada mediante el comando HIDE. 126 Creacion de un sprite Hardware personal ======================================= El unico problema de los sprites computerizados radica en que nunca sabes con precision que sprite Hardware esta siendo usado en un objeto particular. Normalmente los sprites hardware usados en un objeto, cambian cuando el objeto se mueve. Ocasionalmente esto puede suponer un inconveniente, especialmente cuando estes animando objetos como los misiles que necesitan permanecer visi- bles. En estas circunstancias, es util ser capaz de localizar direc- tamente un sprite hardware. Los sprites hardware personales pue- den ser asignados con la instruccion SPRITE y un numero de identi ficacion de 0 a 7. Ejemplo: Sprite 1,100,100,2 Esta orden carga el sprite hardware numero 1 con la imagen nu- mero 2. "N" ahora corresponde al numero de un simple sprite hard- ware, y puede oscilar entre 0 y 7, como ya hemos dicho. Si tu ima gen fuera mas grande de 16 pixels de ancho, AMOS grabara automati camente los sprites necesarios de forma consecutiva, comenzando por el sprite que tu has elegido. Por ejemplo: Sprite 2,200,100,1 Suponiendo que la imagen 1 contiene una imagen con 32 bits y 3 colores. Este comando colocara dicha imagen dentro de los sprites hardware 2 y 3. Nada ocurriria si intentases visualizar el sprite hardware 3 con un comando como SPRITE 3,150,100,1 porque este sprite ha sido ya utilizado. Asi, solo tendrias acceso a los spri tes 0,1,4,5,6 y 7, y el maximo numero y tamaño de tus sprites com puterizados se reducirian proporcionalmente. Cada sprite de 15 colores se complementa con un par de sprites tricolores. Sin embargo, no es posible combinar dos sprites de este modo. Solo las combinaciones 0/1,2/3,4/5,6/7 son las correc- tas. Una consecuencia de esto es que debes asignar siempre a tus sprites Hardware un numero de sprite, o de lo contrario, AMOS re- iniciara tu sprite a partir del proximo grupo de dos, con lo que se malgasta un sprite. Date cuenta tambien que si intentas crear un gran sprite de 15 colores con este sistema, podras facilmente usar todos los spri- tes disponibles en un objeto simple. ATENCION: si estas escribiendo un programa con scrolling, puedes encontrar problemas al usar sprites conjuntamente con los coman- dos SCREEN OFFSET y SCREEN DISPLAY. Ya que pueden generar un cho- que entre el sistema de sprites y la pantalla de mapa-Bit, que ocasionalmente puede alterar la pantalla. Este problema es solo relevante si estas usando los sprites Hardware 6/7. Cuando la pan talla es desplazada hacia la izquierda con SCREEN OFFSET, la can- tidad de tiempo para la actualizacion de tus sprites se reduce, ya que la actualizacion de pantalla tiene prioridad sobre el sis- tema de sprites. Por desgracia, no hay suficiente tiempo de proce samiento para dibujar los sprites 6/7, y entonces apareceran des- dibujados en tu pantalla. 127 Para eliminar este problema, debes crear los sprites 6/7 como sprites Hardware individuales y posicionarlos en pantalla usando coordenadas negativas. Esto evitara que AMOS Basic los use en tus sprites computerizados, permitiendo que los sprites 6/7 no se vi- sualicen en pantalla durante tus operaciones de scrolling, y todo ira bien. La paleta de sprites ==================== Los colores necesarios para un sprite Hardware se almacenan en los registros de color 16-31. No esta permitido que tu pantalla haga uso de esos registros, los colores del sprite estan comple- tamente separados de los colores de pantalla. Este es tambien el caso para el modo grafico HAM (4096 colores). Asi que no hay nada que te impida producir deslumbrantes programas en modo HAM con este sistema. No obstante, encontraras problemas cuando utilices pantallas de 32 o 64 colores conjuntamente con sprites tricolores. Esto se de- be a que los colores utilizados por esos sprites se reagrupan de la siguiente forma: Sprite Hardware Registros de color --------------- ------------------ 0 / 1 17 / 18 / 19 2 / 3 21 / 22 / 23 4 / 5 25 / 26 / 27 6 / 7 29 / 30 / 31 Los registros de color 16, 20, 24 y 28 se consideran como transparentes. La dificultad aumenta debido a la forma en que AMOS genera los sprites computerizados. Los sprites Hardware usados para producir esos objetos varian durante el curso de un juego asi que es vital asegurarse de que los 3 colores usados por cada sprite personal tengan asignados exactamente los mismos valores, de otra forma los colores de tus sprites computerizados cambiaran de forma im- predecible. He aqui un pequeño procedimiento de AMOS que realiza todo el proceso de forma automatica: Procedure INIT_SPRITES Get Sprite Palette For s=0 to 3 For c=0 to 2 Colour s*4+c+17,Colour(c) Next C Next S Endproc La anterior restriccion, no se aplica de hecho, a los sprites de 15 colores. Si deseas obtener los mejores resultados del modo Extra Half Bright o del modo con 32 colores, lo tendras mas facil si utilizas sprites de 4 colores conjuntamente. 128 GET SPRITE PALETTE (Graba los colores de sprite en pantalla) GET SPRITE PALETTE ¡mask¿ Este comando carga completamente la paleta de color utilizada pa ra tus sprites en la pantalla actual. La mascara ("MASK") opcio- nal te permite cargar solo una seleccion de colores de tu paleta de sprites. Cada uno de los 32 colores se representa por un BIT simple en la mascara, numerada de derecha a izquierda. El BIT mas a la derecha representa el status del color 0, el siguiente BIT mostrara el del color 1, y asi sucesivamente. Para cargar un sim- ple color, basta con ajustar el BIT correspondiente a "1". Si por acaso, deseas copiar solo los primeros 4 colores, tendras que ajustar el modelo-BIT como sigue: GET SPRITE PALETTE %0000000000001111 Identicamente, y puesto que los bobs usan el mismo banco que los sprites, este comando puede ser tambien utilizado para cargar los colores de un bob. Control de sprites ================== SET SPRITE BUFFER (Establece la altura del sprite Hardware) SET SPRITE BUFFER n Este comando establece el area de trabajo en la que AMOS crea las imagenes de los sprites hardware. Los valores aceptables para "N" oscilan desde 16 a 256. Para establecer un correcto valor para N simplemente basta con examinar los sprites en el editor de spri- tes y calcular la longitud adecuada para el mayor sprite. Todo sprite que sea mayor que "N" sera partido por el apropiado punto. La cantidad de memoria consumida por el buffer de sprite puede calcularse segun la formula: Memory = N*4*8*3 = N * 96 Asi el minimo buffer es de 1536 bytes y el maximo es de 24 K. Ten presente que este comando borra todas las actuales asignaciones de sprites y resetea el cursor del raton a su estado original. SPRITE OFF (Elimina uno o mas sprites de la pantalla) SPRITE OFF ¡n¿ Este comando elimina uno o mas sprites de la pantalla. Todos los movimientos del sprite actual seran anulados. Al objeto de reini- cializarlos, necesitaras comenzar de nuevo tu patron de movimien- tos. 129 SPRITE OFF (Borra de pantalla todos los sprites) SPRITE OFF N (Solo desactiva al sprite numero N) Ten presente que tus sprites se desactivaran automaticamente siem pre que hagas una llamada al editor de AMOS Basic. Y volveran a ser automaticamente recuperados en sus posiciones originales la proxima vez que accedas al modo directo. SPRITE UPDATE (Controla los movimientos de sprites) SPRITE UPDATE ¡ON/OFF¿ Este comando te permite un total control de los movimientos de tus sprites. Normalmente, cada vez que mueves un sprite, su posi cion se actualiza automaticamente durante el VBL (Periodo de va- cio vertical). Pero si estas moviendo gran cantidad de sprites utilizando el comando SPRITE, la actualizacion se realizara antes de que la totalidad de sprites se hayan movido. Esto puede obser- varse como un salto en tu patron de movimientos. En estas circuns tancias, puedes anular el sistema de actualizacion automatico con el comando SPRITE UPDATE OFF. Una vez que todos los sprites hayan completado sus movimientos puedes, podras deslizarlos suavemente con una llamada al comando SPRITE UPDATE. Esta orden reposicionara cualquier sprite que se haya movido desde la ultima actualizacion. =X SPRITE (Obtiene la coordenada X de un sprite) x=X SPRITE(n) Devuelve la actual coordenada X del sprite N, medida por el siste ma Hardware. Este comando te posibilita chequear rapidamente si un sprite ha sobrepasado el final de la pantalla del Amiga. =Y SPRITE (Obtiene la coordenada Y de un sprite) y=Y SPRITE(n) Y SPRITE devuelve la posicion vertical de un sprite. Como imagina ras, N hace referencia al numero de sprite, y oscila entre 0 y 63 Recuerda que todas las posiciones de sprites son medidas con coor denadas Hardware. GET SPRITE (Carga una seccion de pantalla en el banco de sprite) GET SPRITE ¡s,¿i,x1,y1 to x2,y2 Esta instruccion te capacita para grabar imagenes directamente de pantalla y transformarla en sprites. Las coordenadas x1,y1 y x2, y2 definen un area rectangular que sera capturada y trasladada al banco de sprites. Normalmente todas las imagenes se toman de la pantalla actual. Sin embargo, es tambien posible grabar la imagen desde una pantalla especifica usando el parametro opcional "S". 130 Ten presente que no existen limites para la region que puede ser grabada de esta forma. Mientras tus coordenadas esten dentro de los limites de la pantalla actual, no habra problemas. "I" indica el numero de la nueva imagen. Si no existiera ya un sprite con este numero, una nueva imagen sera creada de forma au- tomatica. AMOS tambien se encargara de reservar espacio en el ban co de sprite, si esto no hubiera sido previamente definido. Existe tambien otro comando equivalente, GET BOB, que es iden- tica a este comando en todos los aspectos. El banco de sprites es ocupado por sprites y bobs, y las imagenes se almacenan en el mis mo formato. Asi, es perfectamente aceptable usar ambas instruccio nes en indistintamente con bobs y sprites. Intenta cambiar la ins truccion sprite por bob. Funciones de conversion ======================= =x SCREEN (Convierten coordenadas hardware en coordenadas =Y SCREEN de pantalla) x=X SCREEN (¡n,¿ xhard) y=Y SCREEN (¡n,¿ yhard) Transforman una coordenada hardware en coordenadas de pantalla, relativas a la pantalla actual. Si las coordenadas hardware radi- can fuera de la pantalla, entonces ambas funciones devolveran un resultado relativo de las pantallas limitrofes. Teclea lo siguien te en modo directo: Print X Screen(130) El resultado debera ser -2. Esto se debe a que la coordenada de pantalla 0 es igual a la coordenada hardware 128 y entonces la conversion de 130 a una coordenada de pantalla resulta una posi- cion 2 pixels a la izquierda de la pantalla. Si el numero de pantalla opcional se incluye entonces, las coordenadas deberan devolver el numero relativo de pantalla N. =X HARD (Convierten coordenadas de pantalla en =Y HARD coordenadas hardware) x=X HARD (¡n,¿ xcoord) y=Y HARD (¡n,¿ ycoord) Estas funciones convierten una coordenada de pantalla en otra de hardware. Existen 4 funciones separadas. Como antes, "N" especifi ca el numero de pantalla que sera usada con estas funciones. To- das las coordenadas tendran valores relativos a esta pantalla. 131 =I SPRITE (Devuelve la imagen actual de un sprite) Image=I SPRITE(n) Esta funcion devuelve el numero de la actual imagen utilizada por el sprite N. Un valor de 0 indicara que el sprite no ha sido mos- trado.