void start_scroll( int número_scroll, int fichero, int gráfico, int gráfico_fondo, uchar región, char indicador_bloqueo )


Descripción:

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 o gráfico de primer plano - 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 o gráfico de segundo plano - 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
  speed   // Velocidad relativa del segundo plano
  region  // 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, y1 de esta estructura (las coordenadas de los planos de scroll), es importante que el proceso que va a modificar estos parámetros se ejecute antes que los procesos que van a pertenecer a un scroll, esto lo podrá hacer modificando la variable pública priority.

- 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. Es importante que el proceso que va a ser la camara se ejecute antes que los procesos que van a pertenecer a un scroll, esto lo podrá hacer modificando la variable pública priority.

Un proceso puede pertenecer a un scroll si su variable pública "ctype = c_scroll" y region es igual a la del scroll, entonces dicho proceso se mueve según el scroll.

Si al llamar a la función start_scroll() ha definido los dos gráficos posibles, (el gráfico de primer y segundo plano), los procesos se moverán según al gráfico de segundo plano con las coordenadas x0, y0. Si solamente se definió un gráfico los procesos se moverán según el gráfico definido, es decir: si se ha definido solo el gráfico de primer plano se moverá según las coordenadas x1, y1 mientras que si solo se definió el gráfico de segundo plano se moverá con las coordenadas x0, y0.

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:
MAIN_PROGRAM_CDIV

PRIVATE
 int fichero1;

BEGIN_PROGRAM

 set_gfx(GFX_AUTODETECT_WINDOWED);
 set_mode(m320x200);

 fichero1=load_fpg("../help.fpg");

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

 scroll[0].camera=this;

 ctype=c_scroll;
 graph=100;
 write(0, 160, 0, 1, "Utilice los cursores para moverse");

 LOOP{
        if (key(_right)) x+=2;
        if (key(_left)) x-=2;
        if (key(_down)) y+=2;
        if (key(_up)) y-=2;
        FRAME;
 }

END_PROGRAM

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=this;); 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:
MAIN_PROGRAM_CDIV
PRIVATE
 int fichero1;

BEGIN_PROGRAM

 set_gfx(GFX_AUTODETECT_WINDOWED);
 set_mode(m320x200);

 fichero1=load_fpg("../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[0].x0-=2;
            scroll[0].x1-=1;
        }
        if (key(_left)){
            scroll[0].x0+=2;
            scroll[0].x1+=1;
        }
        if (key(_down)){
            scroll[0].y0-=2;
            scroll[0].y1-=1;
        }
        if (key(_up)){
            scroll[0].y0+=2;
            scroll[0].y1+=1;
        }
        FRAME;
 }

END_PROGRAM

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 estructura, 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.


Ver: stop_scroll() - Estructura scroll