start_scroll()

start_scroll(<número de scroll>, <fichero>, <gráfico>, <gráfico fondo>,                <número de región>, <indicador de bloqueo>)

Descripción:

Esta es una función de cierta complejidad, que requiere que el usuario tenga cierta soltura (haya realizado algún programa antes) para poder utilizarla.

Crea una ventana de scroll, en la que se realizará una panorámica sobre un gráfico de fondo (el decorado del juego). Es decir, utilizando como fondo del juego un gráfico más grande que la ventana de visualización, se podrá mostrar una parte del mismo e ir desplazándolo en cualquier dirección.

Para conseguir este efecto se llamará a esta función con los siguientes parámetros:

<número de scroll> - Se pueden crear hasta 10 ventanas de scroll en pantalla, con los números del 0 al 9; si sólo se quiere crear una, lo mejor es definir la número 0. Este número será necesario posteriormente para modificar los parámetros de la ventana, pues el sistema necesitará saber cuál de las 10 posibles ventanas de scroll se quiere alterar.

<fichero> - Los gráficos que se pretendan mostrar como fondo o decorado en dicha ventana deben estar en un fichero cuyo código de fichero se debe especificar aquí, como segundo parámetro de la función. Los gráficos cargados con las funciones load_map() o load_pcx() (o creados con new_map()) se utilizarán como si pertenecieran al primer fichero (el fichero con el código 0).

<gráfico> - El tercer parámetro debe ser el código del gráfico principal que se va a mostrar como fondo en la ventana y debe pertenecer al fichero anteriormente indicado. Este gráfico suele ser el decorado principal del juego sobre el que se va a desarrollar la acción, un gráfico más grande que la ventana de visualización, que se irá desplazando en una o varias direcciones y sobre el que se situarán los gráficos del juego.

La ventana de scroll se situará inicialmente con el punto de control número 0 de este gráfico en la esquina superior izquierda, cuando se haya definido este punto en el editor gráfico.

<gráfico fondo> - Aquí se indicará un 0 si se quiere un sólo plano de scroll (un sólo gráfico de fondo), o bien otro código de gráfico si se quiere que éste aparezca como segundo plano de scroll (a mayor profundidad), detrás del plano principal. Para que se vea este plano de fondo es imprescindible que el gráfico principal (primer plano) tenga partes dibujadas con el color número 0 de la paleta, pues estas zonas transparentes serán las que permitirán ver a través de ellas el gráfico de fondo.

<número de región> - Aquí se indicará la región rectangular de pantalla en la que se va a mostrar el scroll, si se indica 0 como número de región, se mostrará en toda la pantalla. El resto de regiones se deben definir previamente con la función define_region() (una región no es más que una zona rectangular de la pantalla).

<indicador de bloqueo> - Aquí se indicará un valor que define si cada uno de los dos planos de scroll es cíclico en horizontal y vertical. Por ejemplo, un plano es cíclico en horizontal cuando al salirse del dibujo por la derecha aparece el dibujo por la izquierda. Para componer este valor se deben sumar las siguientes cantidades:

  + 1 - Si el primer plano es cíclico horizontalmente.
  + 2 - Si el primer plano es cíclico verticalmente.
  + 4 - Si el segundo plano es cíclico horizontalmente.
  + 8 - Si el segundo plano es cíclico verticalmente.

Es decir, 0 si ninguno de los dos planos debe ser cíclico, 15 (1+2+4+8) si ambos planos deben ser cíclicos en ambos ejes, 12 (4+8) si únicamente debe ser cíclico el segundo plano, etc.

Cuando un gráfico (principal o de fondo) sea más pequeño que la ventana de visualización, el sistema forzará a que su plano de scroll sea cíclico pues, en caso contrario, no se podría rellenar la ventana de scroll por completo, sin repetir cíclicamente el gráfico (en mosaico).


Además de la llamada a la función se deben inicializar algunos valores de la estructura global scroll para el correcto funcionamiento de la ventana. Ésta es una estructura de 10 registros (uno para cada posible ventana de scroll) y cada registro tiene los siguientes campos:

  x0, y0 - Coordenadas del primer plano
  x1, y1 - Coordenadas del segundo plano
  z - Plano de profundidad
  camera - Código identificador de la cámara
  ratio - Velocidad relativa del segundo plano
  speed - Velocidad máxima del primer plano
  region1 - Primera región de pantalla
  region2 - Segunda región de pantalla

Hay dos formas de programar el movimiento de las ventanas de scroll:

- Manualmente, modificando en cada imagen del juego los campos x0, y0, x1 e y1 de esta estructura (las coordenadas de los planos de scroll).

- Automáticamente, para lo que se necesita el código identificador de un proceso en el campo camera de esta estructura. Siendo a partir de entonces el sistema el encargado de realizar en la ventana de scroll un seguimiento al gráfico de este proceso.

Ver la ayuda sobre la estructura scroll para más información sobre estos campos, o para saber cómo acceder a ellos.


Ejemplo de scroll AUTOMATICO:
PROGRAM ejemplo_start_scroll;

PRIVATE
    fichero1;

BEGIN
    fichero1=load_fpg("help\help.fpg");

    start_scroll(0, fichero1, 103, 102, 0, 15);

    scroll.camera=id;

    ctype=c_scroll;
    graph=100;
    write(0, 160, 0, 1, "Utilice los cursores para moverse");
    LOOP
        IF (key(_right)) x+=2; END
        IF (key(_left)) x-=2; END
        IF (key(_down)) y+=2; END
        IF (key(_up)) y-=2; END
        FRAME;
    END
END


En el ejemplo se carga el fichero de gráficos y entonces se crea una ventana de scroll con la función start_scroll(). A esta última se le pasan los siguientes parámetros:

0 - Número de ventana de scroll (la primera, puesto que sólo se creará una ventana de esta clase).

fichero1 - Código del fichero del que se deben tomar los gráficos; este es el código del archivo help.fpg que se cargó con la función load_fpg().

103 - Código del gráfico principal (primer plano) del scroll, para ver este gráfico se debe cargar el fichero con el Menú de ficheros y así poder observar cuál es el gráfico con código 103.

102 - Código de gráfico secundario (segundo plano, de fondo); éste es el gráfico que se mostrará en la ventana de scroll detrás del gráfico principal.

0 - Número de región de la pantalla en la que se debe colocar el scroll; con 0 se indica que se debe colocar en la pantalla entera.

15 - Indicador de bloqueo, con 15 (1+2+4+8) se indica que tanto el primer plano como el segundo serán cíclicos en ambos ejes (horizontal y vertical).

Tras llamar a la función start_scroll() el programa define el campo camera de la estructura scroll, asignándole el código identificador del proceso principal (con la sentencia scroll.camera=id;); con esto se convierte el scroll en automático siguiendo a partir de ese momento al gráfico del proceso principal.

El programa continúa definiendo su tipo de coordenada como coordenada de scroll (con la sentencia ctype=c_scroll;), definiendo su gráfico como el número 100, que es una bola marrón (con graph=100;), imprimiendo un mensaje y después permanecerá en un bucle en el que se pueden variar las coordenadas de este proceso (las variables x e y) con las teclas de los cursores.


Ejemplo de scroll MANUAL:
PROGRAM ejemplo_start_scroll;

PRIVATE
    fichero1;

BEGIN
    fichero1=load_fpg("help\help.fpg");

    start_scroll(0, fichero1, 103, 102, 0, 15);

    write(0, 160, 0, 1, "Utilice los cursores desplazar el scroll");
    LOOP
        IF (key(_right))
            scroll.x0+=2;
            scroll.x1+=1;
        END
        IF (key(_left))
            scroll.x0-=2;
            scroll.x1-=1;
        END
        IF (key(_down))
            scroll.y0+=2;
            scroll.y1+=1;
        END
        IF (key(_up))
            scroll.y0-=2;
            scroll.y1-=1;
        END
        FRAME;
    END
END


En el ejemplo se carga el fichero de gráficos y entonces se crea una ventana de scroll con la función start_scroll(). A esta última se le pasan exactamente los mismos parámetros que en el ejemplo anterior.

Tras esto, el programa permanecerá en un bucle dentro del cual; al detectarse las teclas de los cursores se variarán los campos x0, y0, x1 e y1 de la estructura global scroll, los cuales definen las coordenadas de los dos planos del scroll (x0, y0 son las del primer plano y x1, y1 las del segundo).

Se puede observar la diferencia entre ambos métodos; este último, al no haber inicializado el campo camera de la estrucutra, podrá manipular directamente las coordenadas de ambos planos.


Cómo visualizar gráficos de procesos sobre el scroll

Para crear un proceso cuyo gráfico se visualice en la ventana de scroll, se debe definir su variable local ctype como c_scroll (tipo de coordenada como coordenada de scroll), lo que se hará con la siguiente sentencia:

  ctype=c_scroll;

Una vez hecho esto, el proceso se visualizará en el scroll con su gráfico (definido en la variable local graph). El proceso únicamente debe modificar sus variables x e y para moverse por el scroll.


Cuando un proceso pertenezca al scroll (se haya asignado el valor c_scroll a su variable local ctype):

  - Sus variables x e y estarán referidas al punto del gráfico del primer plano sobre el cual se situará el gráfico del proceso.

  - Su variable z ahora será relativa a las variables z de los procesos que también pertenezcan a la misma ventana de scroll. Es decir, cada vez que se pinte una ventana de scroll, se pintarán justo a continuación todos los gráficos que pertenecen a la misma (ordenados por su z), y después se seguirán pintando los procesos que no pertenecen a dicha ventana de scroll.

  - El proceso será eliminado automáticamente cuando se elimine la ventana de scroll a la que pertenece el proceso, con la función stop_scroll(). O cuando se cambie el modo de vídeo con la función set_mode(), ya que al hacerlo se eliminarán también las ventanas de scroll.


Si hubiera varias ventanas de scroll el proceso si visualizaría por defecto en todas; si únicamente se debiera visualizar el algunas de ellas, se debería definir su variable local cnumber. Por ejemplo, si hubiera 6 ventanas de scroll (de la número 0 a la 5) y se quisiera que un proceso se visualizara únicamente en las ventanas 0 y 2, se debería incluir en el mismo la siguiente sentencia:

  cnumber=c_0+c_2;

Para poder observar un ejemplo de lo aquí expuesto, lo mejor es examinar alguno de los juegos ejemplo de DIV Games Studio que utilizan esta técnica, por lo que se remite al lector directamente a los comentarios de estos programas (por ejemplo véase el ejemplo Helioball).


Ver: stop_scroll() - refresh_scroll() - move_scroll() - Estructura scroll