132 12: B L I T T E R O B J E C T S (B O B S) Aunque los sprites hardware son realmente poderosos, presentan algunas fastidiosas restricciones. La solucion consiste en usar el infame chip BLITTER del Amiga. Este es capaz de copiar image- nes en pantalla a una velocidad aproximada de un millon de pixels por segundo. Con la ayuda del Blitter, es posible crear lo que se conoce con el nombre de BOBS. Los BOBS, al igual que los sprites, pueden moverse independien temente a lo largo de la pantalla sin alterar los graficos pree- xistentes. Pero a diferencia de los sprites, los BOBS forman par- te de la pantalla misma, asi que los podras incluir en cualquier modo grafico que desees. Esto te permite generar bobs con mas de 64 colores. Ademas, la unica limitacion de bobs posibles en panta lla es tan solo la memoria disponible. Los BOBS son algo mas lentos que los sprites y consumen mucha mas memoria. Ademas existe una compensacion entre la velocidad de los sprites y la flexibilidad de los bobs. Por fortuna, no hay nada que te impida usar bobs y sprites en el mismo programa. BOB (dibuja un BOB en la pantalla actual) BOB n,x,y,i El comando BOB crea un BOB en las coordenadas x,y utilizando la imagen Ipt. "N" es el numero de identificacion del bob. Los valo res permitidos van de 0 a 63, pero el numero de BOBS puede aumen- tar usando una opcion de la configuracion del programa AMOS. Su- poniendo que dispongas de suficiente memoria, podras situar este limite en el numero que desees. "X" e "Y" especifican la posicion del bob utilizando coordena- das de pantalla estandards. Esas coordenadas no son las mismas que las coordenadas hardware, sus equivalentes, utilizadas para el comando SPRITE. Como los sprites, cada bob es controlado por un HOT SPOT (punto caliente o central). Este puede ser cambiado en cualquier momento con el comando HOT SPOT. "I" se refiere a una imagen del banco de sprites que sera asig nada al bob. El formato de esta imagen es identico al usado para los sprites, asi que si lo deseas, puedes utilizar las mismas ima genes para sprites o bobs. Despues de que hayas creado tu bob, podras cambiar independien temente su posicion o apariencia omitiendo uno o mas parametros de su instruccion. Se puede eliminar cualquiera de los parametros x, y, i, si asi lo haces los datos conservaran su valor original. Esto es particularmente util si estas animando tu bob con AMAL, y te facilita moverlo a cualquier sitio que desees, sin alterar la secuencia de animacion. Sin embargo, debes siempre incluir comas en el orden original. Ejemplo: 133 Load "AMOS_DATA:Sprite/Ocotpus.abk" Flash off:Get Sprite Palette Channel 1 to bob 1 Bob 1,0,100,1 AMAL 1,"Anim 0,(1,4)(2,4)(3,4)(4,4)" AMAL on For x=1 to 320 Bob 1,x,, wait vbl Next x Cuando se moviliza un bob, el area subyacente es reemplazada en su posicion original, produciendo un efecto identico al que produce el comando SPRITE. A diferencia de STOS en el ST, cada objeto se localiza en su propia area de almacenamiento. Esto redu ce la cantidad de memoria utilizada por los bobs, y aumenta dras- ticamente la disponibilidad general. Gracias al BLITTER, de hecho no puede compararse los sprites STOS y los bobs AMOS. Pese a que el comando BOB funciona bien para un pequeño numero de bobs, existe un pequeño inconveniente cuando pretendas utili- zar mas de 3 o 4 objetos en pantalla al mismo tiempo. Esto ocurre porque los bobs son actualizados a la vez que la pantalla, con lo que podras presenciar como se dibujan los bobs, lo que supone una ejecucion de poca categoria. Como alternativa para mejorar la calidad de tus animaciones, puedes limitar tus bobs a la parte inferior de la pantalla, ya que los bobs al dibujarse de forma muy rapida, pueden completar su actualizacion antes que la parte mas inferior de la pantalla. Esto te facilita una ejecucion aceptable con un pequeño consumo de memoria, lo que supone una doble ventaja. Obviamente, esto no puede ser una solucion seria al problema anterior. Asi que antes que destruyas tu copia de AMOS, espera a oir otra forma de eliminar ese inconveniente por completo, inclu- so si utilizas docenas de bobs en cualquier lugar de la pantalla: DOUBLE BUFFER (crea una pantalla de doble buffer) DOUBLE BUFFER Crea una segunda copia invisible de la pantalla actual. Todos las operaciones graficas, incluyendo los movimientos de bobs, son aho ra ejecutados directamente en esta "pantalla logica", sin alterar la imagen del monitor, lo mas minimo. Una vez que la imagen ha sido dibujada, la pantalla logica es visualizada, y la pantalla original ("fisica") se funde con la logica. Este proceso se reali za completamente de forma ciclica, produciendo una ejecucion soli da, incluso si movilizas cientos de bobs simultaneamente a lo lar go de la pantalla. Todo este procedimiento es completamente gestionado por AMOS Basic, asi que una vez que hayas introducido esta instruccion, podras olvidarte por completo del problema. Ten presente que los sprites hardware se visualizan en pantalla siempre utilizando la pantalla fisica, este sistema no tiene ningun efecto sobre las animaciones de sprites. 134 El doble bufer funciona igualmente bien con todos los modos graficos del Amiga. Incluso puede ser usado conjuntamente con el campo de juego doble (DUAL PLAYFIELDS). Pero ten cuidado¡¡: El doble bufer dobla la cantidad de memoria necesaria para las panta llas. Si intentas realizar un doble bufer de muchas pantallas, rapidamente te quedaras sin memoria. En la practica, el doble bufer es una tecnica considerablemen- te util que puede ser explotada de la mayoria de juegos. De hecho ha servido en muchos programas comerciales como Starglider. Pue- des encontrar mas informacion en el capitulo de Pantallas, y tam- bien en los comandos SCREEN SWAP y AUTOBACK. SET BOB (establece el modo de dibujo de un bob) SET BOB n,back,planes,minterms Este comando cambia el modo grafico usado para la visualizacion de un bob en pantalla. "N" es el numero del bob que deseas cam- biar. "BACK" elige la forma de pantalla subyacente a tu bob. Hay tres posibilidades: - Un valor 0 indica que el area subyacente a tu bob sera grabada en memoria. Los datos de la vieja imagen seran automaticamente reemplazados cuando se mueva el bob, originando un efecto de movimiento suave. - Si el parametro "BACK" es positivo entonces el fondo original sera eliminado, y el area tras el bob sera rellenada con el co lor "back"-1. Esto es ideal para mover bobs sobre un bloque de color solido como por ejemplo el cielo azul, a la vez que es tambien mucho mas rapido - Con un valor negativo para "BACK" anularas completamente el proceso de redibujo del fondo. Puedes desactivar el proceso de actualizacion automatica de bobs mediante BOB UPDATE, y manual mente mover tus bobs con el comando BOB DRAW. Esto te permite generar el fondo de pantalla usando tus propias rutinas. "PLANES" es un mapa-BIT que informa a AMOS en que planos de panta lla debera dibujarse tu bob. Como sabes, la pantalla del Amiga se divide en un numero determinado de planos-BIT. Cada plano presen- ta un bit en el color final que este presenta en pantalla. Asi, el primer plano esta representado por el bit 1, el segundo por el 2 y sucesivamente. Normalmente el bob se dibuja en todos los pla- nos-BIT del actual modo grafico. Esto corresponde a un modelo-BIT del tipo %111111. Si ponemos a 0 alguno de esos bits, podras omitir el color se- leccionado del bob que se este dibujando. Esto puede utilizarse para generar un gran numero de efectos intrigantes de pantalla. "MINTERMS" selecciona el modo Blitter usado para dibujar tus bobs en pantalla. Una mayor descripcion de los modos disponibles la po dras encontrar en la seccion SCREEN COPY. Minterms adopta de for- ma habitual alguno de estos 2 valores: 1- %11100010 Si el bob se usa con una mascara 2- %11001010 Si no se ha seleccionado mascara 135 Experimenta libremente con las diferentes combinaciones. No hay peligro de dañar el ordenador si cometes un error. Los progra madores mas avanzados encontraran util la siguiente informacion: Fuente Blitter Proposito -------------- --------- A Mascara Blitter B Objeto Blitter C Pantalla destino Recuerda que recomendamos primero usar SET BOB antes que visuali- zarlos en pantalla. Si no lo haces asi, no se dañara el Amiga ni obtendras un mensaje de error, pero la visualizacion de pantalla aparecera alterada. NO MASK (anula la mascara Blitter) NO MASK ¡n¿ Por defecto, una mascara blitter es creada automaticamente para cualquier bob que muestres en pantalla. Esta mascara se mezcla con el fondo de pantalla para crear el color 0 transparente. Esta tambien sera usada por los comandos de deteccion de colisiones. El comando anterior anula esta mascara, y obliga a toda la ima gen a dibujarse sobre la pantalla. Cualquier parte de la imagen de color 0 aparecera ahora directamente sobre el fondo existente. "N" es el numero de la imagen cuya mascara va a ser anulada. Esta mascara nunca podra ser borrada mientras la imagen permanez- ca en pantalla, de otro modo el bob asociado se destruiria. Si tu deseas anular una mascara de esta forma, es importante desactivar primero los bobs mediante el comando BOB OFF. He aqui un ejemplo: Centre "Click mouse button to remove mask" Double buffer: Load"AMOS_DATA:Sprites/Octopus.abk" Get Sprite Palette DO Bob 1,x Screen(x mouse),y screen(y mouse(,1 if mouse click then bob off:no mask 1 Loop Vease tambien el comando MAKE MASK AUTOBACK (activa sistema automatico de copia de pantalla) AUTOBACK n Cuando este usando una pantalla con doble buffer, es esencial sin cronizar tus operaciones de dibujo con los movimientos de los Bli tter Objects (bobs). Recuerda que cada pantalla doble buffer con- tiene dos visualizaciones separadas. Existe una para el dibujo ac tual, y otra en donde se reconstruyen las imagenes. Si el fondo tras un bob, cambia mientras este esta siendo dibujado, el conte- nido de esa pantalla variara tambien, y aparecera un efecto vibra torio muy molesto. 136 El exclusivo sistema AUTOBACK de AMOS te permite una perfecta solucion para este problema. Te facilita la creacion de graficos hasta en 3 modos graficos, dependiendo de la precision que requie ras. A continuacion los tienes en orden inverso: 1- AUTOBACK 2 (modo por defecto) En este modo, todas las operaciones graficas se combinan auto- maticamente con las actualizaciones de bobs. Asi cualquier cosa que dibujes en pantalla aparecera, directamente por debajo de los bobs, como por arte de magia. Los principios de este sistema se comprenden con el siguiente listado: Bob Clear: Rem dibuja en pantalla , anulando los bobs Plot 150,100: Rem esto puede ser un ejemplo Bob Draw: Rem redibuja los bobs Screen Swap: Rem proxima pantalla Wait vbl Bob Clear Plot 150,100: Rem realiza la misma operacion otra vez Bob Draw Screen Swap: Rem recupera la primera pantalla Wait vbl Como puedes ver, todas las actualizaciones de pantalla se ejecu- tan exactamente en 2 ocasiones. Existe solo una operacion para ambas pantallas (logica y fisica). Un problema obvio, es que tus graficos se ejecutan en el doble de tiempo. Ademas, el programa sufrira al menos 2 vaciados verti- cales (Wait vbl), cada vez que introduzcas algo en pantalla. Esto puedo ocasionar incomodos retrasos en la ejecucion de procesos criticos como la deteccion de una colision. 2- AUTOBACK 1 (modo semiautomatico) Realiza cada operacion grafica en ambas pantallas (logica y fi sica). No cuenta para nada con tus bobs, con lo que deberas usar este sistema solo para la actualizacion del area actual de dibu- jos. A diferencia del modo estandard, no tienes que detener el pro- grama hasta el proximo VBL. El Modo 1 es ademas ideal para cier- tos objetos, como el control de paneles o tablas de records, que necesitan ser continuamente actualizadas durante un programa. 3- AUTOBACK 0 (modo manual) Detiene el sistema AUTOBACK. Ahora, todos los graficos se eje- cutan en la pantalla logica y a la maxima velocidad posible. Debe rias usar esta opcion, si necesitas repetidamente redibujar una gran pantalla o seccion del fondo durante el curso de un programa Esto te permitira ejecutar facil y rapidamente tus rutinas para deteccion de colisiones a intervalos regulares, sin afectar la ca lidad general de la animacion. He aqui un ejemplo tipico: 137 Bob Update Off Repeat Screen Swap Wait VBL Bob Clear: Rem ahora redibujaras cualquier cambio grafico : Rem ejecuta tus rutinas de deteccion colisiones etc Bob Draw Until WIN Ten en cuenta que este procedimiento solo funcionara si hay una suave progresion de pantalla a pantalla. Queda a tu cargo por com pleto, la unificacion de las pantallas logica y fisica una en la otra. Supongamos por ejemplo, que deseas mostrar un bob sobre una se rie de bloques aleatorios. Entonces necesitas una rutina como la siguiente: Load "AMOS_DATA:Sprites/Sprites.abk": Flash Off Get Sprite Palette: Double Buffer: CLS 0: Autoback 0 Update Off: Bob 1,160,100,1 Do Bob Clear X=RND(320)+1: Y=RND(200)+1: W=RND(80)+1 H=RND(50)+1: I=RND(15) INK I: Bar x,y to x+w,y+h Rem ahora podras normalmente llamar a tus rutinas para la deteccion de colisiones, etc Bob Draw Screen swap: wait vbl Loop Pero dado que no existe relacion entre las pantallas fisica y logica, la visualizacion vibrara continuamente de una pantalla a otra. Para solucionar este inconveniente, necesitaras simular el sistema original AUTOBACK. Asi que cambia las lineas del ejemplo previo DO y LOOP como sigue: Rem actualizacion de la pantalla primera Screen swap:Wait vbl Bob clear X=RND(320)+1: Y=RND(200)+1: W=RND(80)+1 H=RND(50)+1: I=RND(15) Ink i:Bar x,y to x+w,y+h Bob draw Rem actualizacion de la pantalla segunda Screen swap:wait vbl Bob Clear Ink I:Bar x,y to x+w,y+h Bob Draw 138 De este modo, las dos pantallas se actualizaran exactamente al mismo tiempo y la visualizacion aparecera uniforme, incluso si existe una gran cantidad de actividad en el fondo de pantalla. AUTOBACK puede ser libremente usado en cualquier punto de tus programas. Siendo perfectamente posible usarlo de forma separada para los distintos metodos graficos en distintas partes de tus programas. Es totalmente compatible con todas las operaciones gra ficas, incluyendo Blocks, Iconos y Ventanas. Comandos de control de BOBS =========================== BOB UPDATE (controla los movimientos de un bob) BOB UPDATE ¡ON/OFF¿ Normalmente todos los bobs se actualizan una vez cada cincuentavo de segundo usando una rutina de interrupciones. Pese a que esto es aconsejable en la mayoria de programas, existen algunas aplica ciones que requieren un control mucho mas exacto del proceso de dibujo. El comando anterior activa/desactiva el sistema de actualiza- cion de bobs. Podras ahora redibujar tus bobs en el momento mas adecuado de tu programa. Esto es ideal cuando estes animando un gran numero de objetos, permitiendote mover tus bobs a su posi- cion antes de que se dibujen en pantalla. Inevitablemente esto provoca una ralentizacion de los movimientos de tu programa. Una nota de atencion: la actualizacion de bobs solo se produci- ra en el siguiente VBL. Tambien recuerda que este comando siempre redibujara los bobs en la actual pantalla logica, por lo que no debes olvidar hacer un "swaping" mediante el comando SCREEN SWAP, de lo contrario no ocurrira nada aparentemente. BOB CLEAR (anula todos los bobs de pantalla) BOB CLEAR Este comando anula todos los bobs de pantalla, y redibuja el fon do subyacente a los mismos. Suele usarse con BOB DRAW como una alternativa al comando BOB UPDATE. BOB DRAW (Redibuja los bobs) BOB DRAW Cuando se han redibujado bobs en pantalla, se habran ejecutado los siguientes pasos: 139 1- Todos los bobs activos se eliminan de la pantalla logica y se reemplazan las regiones de fondo. Este paso es ejecutado por la instruccion BOB CLEAR 2- Se realiza una lista de todos los bobs que se han movido desde la ultima actualizacion 3- Las regiones del fondo en las nuevas coordenadas de pantalla se almacenan en memoria 4- Todos los bobs activos se redibujan en dichas nuevas coordena das en la pantalla logica 5- Si esta activado el sistema de DOUBLE BUFFER, se producira un swaping entre las pantallas fisica y logica El comando BOB DRAW ejecuta los pasos 2 al 4 del proceso ante rior. Suponiendo que deseas crear un scrolling en un juego de ar- cade. En esta situacion, sera absolutamente vital que las opera- ciones de scroll esten perfectamente sincronizadas con los proce sos de movimiento; ya que si los "aliens" se movieran en el preci so momento en el que el scroll se produce, entonces las ares del fondo se redibujaran en el lugar incorrecto. Esto alteraria por completo tu pantalla. =X BOB (obtiene la coordenada X de un bob) x1=X BOB(n) Devuelve la actual coordenada X del bob numero N. Esta coordenada es medida en relacion a la pantalla actual. Ver tambien Y SPRITE, X MOUSE e Y MOUSE. =Y BOB (obtiene la coordenada Y de un bob) y1=Y BOB(n) Y BOB complementa al comando anterior devolviendo la coordenada Y del bob n. Este valor se mide en coordenadas normales de pantalla =I BOB (devuelve la imagen actual de un bob) Image=I BOB(n) Esta funcion devuelve el numero de la imagen actualmente usada por el bob n. Un valor de 0 indicara que el bob no esta siendo visualizado. LIMIT BOB (Limita un bob a una zona rectangular de pantalla) LIMIT BOB ¡n,¿ x1,y1 to x2,y2 Este comando restringe la visibilidad de tus bobs a una zona rec- tangular enmarcada por las coordenadas x1,y1 y x2,y2. Las coorde- nadas X se redondean hasta el primer pixel multiplo de 16. Ten en cuenta que la anchura de esta region debera ser siempre mayor que la anchura de tus bobs, de otro modo obtendras un mensaje de error (Illegal Function Call). 140 Si se incluye, "N" especifica el numero de un bob simple que sera el afectado por esta instruccion, de otro modo, seran TODOS los bobs los restringidos. Podras restituir el limite visible has ta la totalidad de la pantalla, tecleando: LIMIT BOB GET BOB (Carga seccion de pantalla en el banco de sprites) GET BOB ¡s,¿ i,x1,y1 to x2,y2 Esta instruccion es identica al comando GET SPRITE. Graba una ima gen de la pantalla actual en el banco de sprites. "X1,Y1" y "X2, Y2" son las coordenadas de las esquinas supero-izquierda e infero -derecha del area rectangular que se grabara. "I" especifica el numero de imagen que sera cargada con este area. "S" selecciona un numero opcional de pantalla de la cual la imagen sera tomada. Vease GET SPRITE para mas detalles. PUT BOB (coloca una copia de un bob en pantalla) PUT BOB n Este comando es opuesto al previo (GET BOB). Su accion consiste en colocar una copia del bob "N" en la actual posicion de panta- lla. Funciona impidiendo que el area de fondo subyacente sea dibu jada durante el proximo VBL. Al objeto de sincronizar la actuali- zacion de bobs con la visualizacion de pantalla, deberas siempre seguir este comando con una instruccion WAIT VBL. Ten en cuenta que despues de que esta instruccion haya sido ejecutada, el bob original puede ser movido o animado, sin que se produzcan alteraciones en pantalla. PASTE BOB (Dibuja imagen del banco de sprite en pantalla) PASTE BOB x,y,i Este comando dibuja una copia de la imagen numero "I" en las coor denadas de pantalla "X,Y". A diferencia del comando anterior, la imagen se dibuja inmediatamente en pantalla, y no se modifica el resto de reglas generales. Ver PASTE ICON. BOB OFF (Anula un bob de visualizacion) BOB OFF ¡n¿ Ocasionalmente, puedes necesitar anular ciertos bobs conjuntamen- te de la pantalla. Este comando borra el bob numero "N" de la pan talla y da por finalizada cualquier animacion asociada. Si el pa rametro "N" es omitido, todos los bobs seran anulados por esta instruccion.