Revistas en Papel
Anterior
Menú
Logotipo

AMIGA.InFo • Mayo/Junio 1995 • Número 3

 
EFECTOS DE VÍDEO II

AMOS BASIC

Rafael 
Romero

NOTA: Pulsando sobre las fotos con borde azul ampliarás la imagen.

Segunda parte de
Efectos de Vídeo

El Amiga es uno de los ordenadores personales mejor diseñado de todo el mercado: Sprites por Hardware, diferentes resoluciones de pantalla, movimientos muy rápido de cualquier gráfico, etc, son algunas de sus características más importantes. En el artículo de este mes veremos el tratamiento de las pantallas desde AMOS.

En el anterior capítulo expliqué algunas formas de hacer efectos de vídeo de forma sencilla similares a los de programas tan conocidos como el Deluxe Video (Electronics Arts) y el famosísimo Scala Multimedia (Scala Inc). Pero estos efectos, en realidad, son posibles de hacer de forma fácil con casi cualquier ordenador (con un hardware adecuado claro está) y un poco de imaginación, uniendo a esto un poco de conocimientos de programación. En resumen, en el capítulo anterior no hice uso de ninguna característica especial de nuestro AMIGA, excepto posiblemente su extraordinaria velocidad para el tratamiento de gráficos.

Como la mayoría de usuarios ya sabe, el AMIGA cuenta con unas características hardware excepcionales para ser un ordenador personal: sprites por hardware, diferentes resoluciones de pantalla, movimiento de gráficos superrápidos, etc. pero posee otras las cuales a primera vista no parecen muy importantes pero también lo son: el tratamiento de las pantallas.

En el AMIGA podemos disponer de varias pantallas a la vez y todas con sus propias características y visibles al mismo tiempo (ver dibujo 1). Es más, nosotros podemos poner una pantalla delante de otra y crear un efecto de transparencia y por si fuera poco podemos mover la pantalla (con algúnas limitaciones claro). UN ejemplo de esto último lo tenemos en casi todos los programas que funcionan bajo Intuition y abren una pantalla (ejemplo CygnusEd de ASDG Inc.) la cual puede ser desplazada usando la barra de desplazamiento de la pantalla. Si queremos probar la capacidad de desplazamiento del Workbench sólo tenemos que abrir el cajón System:Prefs y pulsar ScreenMode, desactivamos los botones por defecto y escribimos, por ejemplo, de ancho 1000 y alto 1000 y pulsamos USAR. Inmediatamente la pantalla se hará más grande, pero no la veremos entera ya que para ello nos desplazaremos con el ratón.

¿Pero en AMOS podemos aprovechar todo esto? La respuesta es SI. Como ya dije anteriormente el AMOS está pensado para sacar el máximo partido de lAMIGA, de todo el AMIGA. Como ya es costumbre mía, primero explicaré los comandos que voy a usar en este capítulo. Estos son de dos tipos :los primeros afectarán a la posición relativa de la pantalla respecto del origen de coordenadas hardware o respecto de otra pantalla y los segundos harán un uso especial del Copper.

Antes de nada, unas notas aclaratorias: si alguna vez habéis curioseado en el cajón System:Prefs y activado el programa OverScan, veréis que podéis mover la pantalla del Workbench hacia cualquier posición. Esto es debido a que el AMIGA trabaja internamente con unas coordenadas hardware que no tienen por qué coincidir con la posición de la pantalla en el área de visualización de tu monitor o televisor. Este origen de coordenadas hardware es fijo e igual en todos los AMIGAs y es un punto de referencia para poder posicionar una pantalla. Otro detalle es que como las pantallas del AMIGA son independientes físicamente, pueden tener diferentes colores y resoluciones pero SIEMPRE tiene preferencia la pantalla que está en primer plano sobre todas las demás, es decir, si la primera pantalla es entrelazada y la bajamos, veremos que la pantalla de detrás también está en entrelazado (en monitores multisync pasan cosas más divertidas cuando trabajamos con pantallas de diferentes frecuencias). Los Sprites son independientes de las pantallas, variando sólo de color en aquellas que usan los registros de color reservados para los sprites. Otro detalle a tener en cuenta es que, al trabajar, el AMOS hace como si sólo tuviera los OLD CHIPS. Las coordenadas hardware son siempre en baja resolución independientemente de la resolución de la pantalla. también los Sprites son siempre en baja resolución.


Más comandos sobre pantallas

La siguiente lista de instrucciones se añadiría a las comentadas en el capítulo anterior con Screen Open y sus compañeras. Os aviso también de una cosa: estas instrucciones no son tan "inocentes" como otras que ya he explicado, pueden llegar a bloquear vuestro ordenador.


Screen Copy (versión extendida)

Esta instrucción ya la comenté anteriormente pero no del todo. Screen Copy se basa en la posibilidad que tiene el Blitter de mover y copiar grandes zonas de memoria de una posición a otra. Pues bien, la versión extendida va más allá y hace uso de otra particularidad del Blitter: la capacidad de hacer operaciones lógicas entre las zonas de origen y destino.

Hay 256 posibles combinaciones de las cuales sólo se usan 16. Las más comunes son las siguientes:

  %11000000 reemplazar
  %00110000 invertir
  %10000000 and
  %11100000 or
  %01100000 xor

Su sintaxis es la siguiente:

  Screen Copy origen,x1,y1,x2,y2 To destino,x3,y3,modo

Screen Hide

"Esconde" una pantalla. La pantalla se vuelve invisible y sólo puede volver a verse con el comando Screen Show. Tiene dos formas:

  Screen Hide

Esconde la pantalla en curso

  Screen Hide num

Esconde la pantalla num


Screen Show

Visualiza una pantalla que previamente había sido escondida con el comando Screen Hide.

  Screen Show numpantalla

Nota: Screen Hide y Screen Show son útiles para hacer operaciones que sean lentas y no queramos que se vean por ejemplo al usar muchos Print seguidos.


Screen To Back

Mueve una pantalla al último plano de visualización. Tiene dos sintaxis:

  Screen To Back

Mueve al final la pantalla actual de trabajo.

  Screen To Back num

Mueve al final la pantalla num.


Screen To Front

Mueve una pantalla al primer plano de visualización. Tiene dos sintaxis:

  Screen To Front

Mueve al principio la pantalla actual de trabajo.

  Screen To Front num

Mueve al principio la pantalla num.

Nota: Screen To Back y Screen To Front pueden ser usadas para lo mismo que Screen Show y Screen HIde pero puede ser más interesante su uso para intercambiar pantalla rápidamente, creando un efecto de flash.


Screen Display

Fuerza el área de visualización de una pantalla desde las coordenadas hardware (x,y) hasta (x+ancho,y+alto).

  Screen Display num,x,y,ancho,alto

Donde:

  • num es el número de la pantalla.
  • x es la coordenada de las columnas.

¡Atención! se refiere a coordenadas hardware y sus posibles valores son de 0 a 448 redondeando siempre a múltiplos de 16.

  • y es la coordenada de las filas y su rango va de 0 a 312. También se refiere a coordenadas hardware.
  • ancho es, lógicamente, el ancho de nuestro área de visualización, la cual puede ser menor que el ancho de nuestra pantalla.
  • alto igual que ancho pero para la altura.

Nota: Screen Display se usa para abrir pantallas y que no ocupen todo el área de visualización. También sirve para mover pantallas (ver listado 1).


Screen Offset

Cambia la posición del primer pixel (coordenadas de la pantalla columna 0 y fila 0) respecto del área de visualización.

  Screen Offset num,x,y

Nota: Screen Offset se usa para mover una pantalla en la dirección que nosotros deseemos, por ejemplo, para hacer Scrolls mucho más suaves que usando Screen Copy y Def Scroll. Un ejemplo de esto último se puede ver en los listados 1 y 2.


Dual Playfield

Visualiza dos pantallas una sobre la otra siendo el color 0 de la primera transparente, permitiendo dejar ver áreas de la segunda pantalla. La paleta de colores que se usa es sólo la de la primera pantalla siendo asignados para la segunda pantalla los registros de colores del 8 al 15. De todas maneras, a todos los efectos, a nosotros no nos importa, pues el AMOS gestiona los colores de manera que nos sea lo más cómodo posible y no nos demos cuenta de esto. Como el AMOS no usa los AGA las limitaciones son las de un AMIGA con OLD CHIPS. Las dos pantallas tienen que ser de la misma resolución (alta o baja). Cuando son de alta resolución, el límite es de 4. Cuando son de baja, el número máximo de colores es 8. No es necesario que las dos pantallas tengan el mismo número de colores.

Listado 1
Cls 0
Curs Off
Print "Cuando se pare el Scroll pulsa una tecla"
Screen Open 1,640,200,8,1,Lowres
Set Pattern 5
Bar 0,0 To 640,200
Paint 160,100
Curs Off
Screen Display 1,140,64,320,200
A$="  Esta pantalla es de 640 de ancho"
A$=A$+" y 200 de alto. "
A$=A$+"Este Scroll es por software."
Def Scroll 1,0,0 To 640,200,-1,0
Print A$
For N=1 To 320
   Scroll 1
Next N
Wait Key
A$="  Esta pantalla es de 640 de ancho"
A$=A$+" y 200 de alto. "
A$=A$+"Este Scroll es por hardware."
Set Pattern 5
Bar 0,0 To 640,200
Paint 160,100
Locate 0,0
Print A$
For N=1 To 320
  Screen Offset 1,N,0
  Wait Vbl
Next N
End

Listado 2
Screen Open 0,640,512,4,Lowres
X=0
Y=0
I$=""
Print " Esto es un ejemplo de pantalla más grande"
Print " que el área de visualización."
Print " Usa las teclas del cursor para moverse."
Print " Pulsa un botón del ratón para acabar o"
Print " la tecla Escape."
Bar 100,100 To 540x512
Ink 1
Bar 150,150 To 490,362
Repeat
   I$=Inkey$
   If(I$=Cdown$) and (Y<248)
     Inc Y
   End If
   If(I$=Cup$) and (Y>0)
     Dec Y
   End if
   If(I$=Cleft$) and (X>0)
     Dec X
   End If
   If(I$=Cright$) and (X<296)
     Inc X
   End If
   Screen Offset 0,X,Y
Until(Mouse Click) or (Asc(I$)=27)
   Dual Playfield pantalla1, pantalla2

Nota: Si no queremos tener problemas, hay que definir primero la segunda pantalla y luego la primera (ver listado 3). Recordad que los colores de la segunda pantalla están definidos por los registros del 8 al 15 de la primera pantalla. Si queremos que las dos pantallas tengan exactamente los mismos colores tenemos que copiar los colores de 0 a 7 sobre los del 8 al 15.

Los sprites mantienen su paleta de colroes en Dual Playfield.


Dual Priority

Cambia la prioridad entre dos pantallas que están en Dual Playfiield. La paleta de colores sigue siendo la de la pantalla que fue definida como primera.

  Dual Priority pantalla1, pantalla2


Efectos de Copper: Arco Iris

Todos los comandos anteriores utilizaban la capacidad del Blitter de mover datos a alta velocidad o de crear efectos, pero las instrucciones que explicaré ahora hacen uso de otro coprocesador, el Copper. El Copper tiene la particularidad de hacer cambiar de valor un registro de color tan rápidamente que puede dar la impresión de que en pantalla hay más colores de los que realmente disponemos.

Este truco es muy usado en demos y juegos para generar degradados de colores y efectos de horizontes de una manera sencilla pero espectacular. Además de estos "arco iris", podemos generar otros efectos como objetos supercoloridos, cuando en realidad sólo tienen un color, pero esto ya no es tan sencillo. De momento aquí, comentaré los comandos relacionados con la definición de "arco iris" dejando para más adelante los comandos más potentes del Copper. Como mínimo, hasta que se haya comentado algo más extensamente en el funcionamiento de éste en otras secciones de la revista.


Datos sobre los Rainbows

Los Rainbows (arco iris en inglés) de AMOS son degradados de colores que afectan a un solo registro de color, o dicho de otra manera, los Rainbows sólo afectan a los pixels de la pantalla que tengan un determinado color.

Cada línea horizontal del degradado puede tener un valor entre 0 y 4095, el cual representa uno de los colores de la paleta del AMIGA. En los Rainbows no se pueden definir líneas horizontales con más de un color. tampoco pueden coexistir 2 rainbows en las mismas coordenadas, tiene prioridad el de número más alto.

Por suerte, lo que sí se puede definir es la altura inicial en la que empieza y el número de líneas horizontales a las que afecta, aparte evidentemente del registro de color afectado. Con esto quiero decir que podemos definir un rainbow que afecte sólo a la mitad superior de la pantalla y al mismo tiempo otro que afecte a la segunda mitad y los dos al mismo registro de color.


Definición de Rainbows

Los comandos para definir los rainbows son muy sencillos pero a la vez diferentes de lo visto hasta ahora en AMOS.


Set Rainbow

Con este comando podemos definir rainbows de una forma muy sencilla, pero no el valor exacto de cada línea. Sobre todo se usa para hacer degradados simples de colores y generar efectos como "cielos" para juegos. Su sintaxis es un poco peculiar:

  Set Rainbow numr, numcolor, tam,
    "Rojo", "Verde", "Azul"

Donde:

  • numr es el número de rainbow. Su valor está entre 0 y 3.
  • numcolor es el registro de color afectado por el rainbow. Para que el efecto sea visible, tiene que ser un registro de color usado en pantalla. Su rango va de 0 a número de colores de la pantalla-1.
  • tam es el tamaño de la tabla de la tabla necesaria para almacenar el rainbow. Es necesario 1 unidad por cada línea que se vea en pantalla. Su rango es de 16 a 65500.
  • "Rojo" es la definición de las componentes de color rojo. Tiene a su vez el siguiente formato "líneas, paso, repetición" donde líneas es el número de líneas horizontales afectadas, paso es el cambio de color de la paleta, su rango es de 0 a 15, y repetición es el número de veces que queremos que se repita dentro del rainbow.
  • "Verde" lo mismo que "Rojo" pero para las componentes verdes.
  • "Azul" lo mismo que "Rojo" pero para las componentes azules.

Nota: Los parámetros de las componentes son opcionales. Si no queremos definir valores para una componente, simplemente ponemos comillas sin nada en medio. Esto se debe a que con esta instrucción hacemos realmente dos cosas: la primera es reservar memoria para nuestro rainbow y la segunda es definirlo (ver listado 4).


Rain

Otra manera de definir un rainbow es con esta instrucción. Con ella podemos definir exactamente qué valores deseamos para cada línea de nuestro efecto. Normalmente se usa en combinación con un bucle para leer los datos. Pero además, esta instrucción también nos informa de que valor contiene un rainbow (mejor dicho, su tabla) en una determinada posición. Por tanto, tiene dos formas:

  Rain [numr,ind)=valor

Donde se asigna un valor a una posición de la tabla del rainbow y también valor=Rain (numr,ind) donde nos devuelve el valor de la tabla de la posición ind.

Nota: Rain se ha de utilizar en conjunción con Set Rainbow (ver listado 5).


Rainbow

Poner en pantalla un Rainbow previamente definido. Los rainbow afectan a todas las pantallas que estén abiertas y queden dentro de su área de visualización. Para su disposición en pantalla, se usan coordenadas hardware.

  Rainbow numr,offset,inicio,altura

Donde:

  • numr es el número del rainbow que usamos. Su rango es de 0 a 3.
  • offset es la posición inicial de la tabla del rainbow.
  • inicio es la línea horizontal inicial.
  • altura es el número de líneas horizontales afectadas.

Nota: Si usamos esta instrucción dentro de un bucle, podemos conseguir diversos efectos, bien para desplazar el rainbow por la pantalla (ver listado 4) o bien para dar sensación de movimiento (ver listado 5).


Rainbow Del

Borra un rainbow. Una vez borrado hay que volverlo a definir. Tiene dos variantes:

  Rainbow Del numr

borra el rainbow número numr previamente definido y

  Rainbow Del

borra todos los rainbows definidos.

Listado 3
Screen Open 2,320,200,8,Lowres
Load Iff "Demodualplayfield.lbm",1
Screen Open 0,320,200,8,Lowres
Dual Playfield 0,1
Screen To Front 0
Screen 0
Colour 1,0
Wait 5
Proc COPIARPALETA[1,0]
For N=160 to 0 Step -1
   Ink 0
   Draw N,0 To 159,200
   Draw 320-N,0 To 159,200
Next N
For N=160 To0 Step -1
   Ink 0
   Draw 0,0 To N,200
   Draw 320,0 To 320-N,200
Next N
Screen 2
Cls 0
Paper 0
Ink 3
Curs Off
Centre "Esto es un ejemplo de Dual Playfield"
Print Cdown$
Print Cdown$
Centre "Con esta simple técnica podemos hacer"
Print Cdown$
Print Cdown$
Centre "infinidad de efectos para video, así"
Print Cdown$
Print Cdown$
Centre "como nuestras propias presentaciones."
Screen 0
For N=0 To 199
   Screen Copy 2,0,0,320,N+1 To 0,0,199-N
Next N
End
Procedure COPIARPALETA[SRC,DEST]
   Rem ¡Atención! Hay que copiar a partir del octavo color
   Rem debido a que trabajamos en Dual Playfield
   For N=0 To 7
     Screen SRC
     C=Colour(N)
     Screen DESC
     Colour N+8,C
   Next N
End Proc

Listado 4
Screen Open 0,320,256,16,Lowres
Set Rainbow 0,1,60,"(4,1,15)","",""
Set Rainbow 1,1,60,"","(4,1,15)",""
For N=0 To 256
   Rainbow 0,0,N,60
   Rainbow 1,0,256-N,60
   Wait Vbl
Next N
For N=0 To 256
   Rainbow 0,0,256-N,60
   Rainbow 1,0,N,60
   Wait Vbl
Next N

Listado 5
Pen 3
Curs Off
Centre "Rainbow de 4096 colores"
Print Cdown$
Print "Pulsa una tecla."
Wait Key
Print Cdown$
Centre "Para acabar pulsa un botón del ratón"
Set Rainbow 0,1,4096,"","",""
For N=0 To 4095
   Rain(0,N)=N
Next N
Rainbow 0,0,0,200
N=0
Repeat
   Add N,1,0 To 4095
   Rainbow 0,N,0,256
   Wait Vbl
Until Mouse Click
Rainbow Del 0
End


Comentarios de los listados.

En el listado 1 tenemos un ejemplo de cómo hacer scrolls en AMOS. En éste utilizamos dos de las posibilidades que ofrece (por cierto, aún hay más). La primera es la solución sencilla usando los comandos Def Scroll y Scroll que nos da ya hechos específicamente para ésto, pero los cuales son muy lentos. La segunda es, a su manera, igual de sencilla pero como comprobaréis el efecto conseguido es mucho más suave. Esto es debido a que la primera opción se basa totalmente en la velocidad del Motorola sin usar el Blitter mientras que la segunda lo que hace es desplazar físicamente nuestra pantalla.

El listado 2 es un ejemplo de la capacidad del AMOS de crear pantallas más grandes del área de visualización y poder verlas a pesar de todo.

El listado 3 es un ejemplo de Dual Playfield. Lo primero que hacemos es abrir una pantalla que usaremos de buffer para ciertas operaciones, luego cargamos una imagen iff en otra pantalla y finalmente abrimos una tercera pantalla. A continuación definimos el Dual Playfield entre la pantalla 0 y la 1. Notad que he abierto primero la 1 y luego la 0.

Para que la pantalla 0 y 1 tengan los mismos colores copio los colores 0 a 7 sobre el 8 al 15. A continuación borro la pantalla 0 (la cual está delante de la 1) con un efecto de barrido, dejando ver el contenido de la pantalla de debajo (la imagen cargada al principio). Por último, imprimimos un mensaje en la pantalla 2 y lo copiamos en la pantalla 0 con un efecto de scroll hacia arriba, de esta manera parece que las letras pasen por encima del dibujo como si fueran rótulos de televisión.

Los listado 4 y 5 son ejemplos de Set Rainbow, Rain y Rainbow, los cuales creo que son de fácil comprensión. El listado 4 pone en pantalla dos barras multicolores y las desplaza por la pantalla. El listado 5 es un ejemplo de sensación de desplazamiento, cambiando sólo el índice de inicio de la tabla de nuestro rainbow.


Conclusión

Con todo lo explicado hoy más los ejemplos, debería ser posible que cualquiera de vosotros pudiera empezar a hacer efectos que hasta hace poco os resultaba imposible de hacer. De todas maneras, ya sabéis que el límite es vuestra imaginación, pero si tenéis alguna duda escribidme e intentaré resolverla. Hasta la próxima.


Envía esta página web a un amigo:
Esta opción está desactivada temporalmente, rogamos disculpen las molestias

Volver a la página anterior

Al menú principal