move_scroll()

move_scroll(<número de scroll>)

Descripción:

Fuerza a mover un scroll automático de forma inmediata. Esta es una función algo avanzada y por ello puede resultar difícil de comprender su propósito.

La función requiere como parámetro el <número de scroll> de 0 a 9 que se indicó en la función start_scroll() como primer parámetro cuando se inició el scroll.

Esta función se utiliza cuando una región de scroll se controla automáticamente, por haber definido el campo camera de la estructura scroll correspondiente con el identificador de un proceso.

El propósito es forzar a que se actualicen los valores (x0, y0, x1 y y1) de dicha estructura; si no se utiliza esta función estos valores no se actualizarán hasta la próxima imagen del juego.

Es decir, cuando un scroll se controla de forma automática y otro proceso necesita conocer antes de la próxima imagen el valor de las coordenadas de dicho scroll (normalmente para colocarse él en una posición acorde al movimiento del fondo) se debe hacer esto:

1 - Se inicia el scroll con start_scroll().

2 - Se crea el proceso que se utilizará como cámara y se pone su código identificador en el campo camera de la estructura scroll.

3 - A este proceso se le debe poner una prioridad muy alta, para que se ejecute antes que el resto de los procesos (poniendo en su variable local priority un valor entero positivo como, por ejemplo, 100).

4 - Justo antes de la sentencia FRAME del bucle del proceso usado como cámara se llamará a la función move_scroll().

De esta forma se garantizará que este proceso se ejecute el primero y, justo al finalizar, actualice los valores (x0, y0, x1 y y1) de la estructura scroll, de forma que el resto de los procesos puedan utilizar estas variables ya actualizadas.

El uso más generalizado de esta función es cuando en una ventana de scroll se quieren tener más de dos planos de fondo y, para ello, se crean una serie de procesos que simulen un tercer o cuarto plano, situando sus coordenadas en función de la posición exacta del scroll en cada imagen. A continuación se muestra un programa que lo hace.

Programa ejemplo:
PROGRAM ejemplo_move_scroll;

PRIVATE
    fichero1;
    contador;

BEGIN
    set_fps(100, 0);
    fichero1=load_fpg("help\help.fpg");
    start_scroll(0, fichero1, 103, 102, 0, 15);
    scroll.camera=id;
    priority=100;
    FROM contador=-2000 TO 2000 step 100;
        proceso_móvil(contador);
    END
    write(0, 160, 0, 1, "Utilice cursor derecha e izquierda para moverse");
    graph=101;
    ctype=c_scroll;
    LOOP
        if (key(_right))
            x+=2;
            flags=0;
        END
        if (key(_left))
            x-=2;
            flags=1;
        END

        move_scroll(0); // Actualiza la estructura scroll[]

        FRAME;
    END
END

PROCESS proceso_móvil(x_scroll)
BEGIN
    ctype=c_scroll;
    z=100;
    graph=104;
    LOOP
        x=x_scroll-scroll.x0;
        FRAME;
    END
END


Este ejemplo inicia un scroll a pantalla completa con dos planos y después mueve un triángulo hacia la derecha e izquierda con los cursores; este proceso será la cámara del scroll, centrándose la visión en el mismo de forma automática (al poner scroll.camera=id;).

Pero, además, crea un total de 40 procesos (de -2000 hasta 2000, cada 100 puntos) con el dibujo de una banda vertical de colores que se moverán como si fueran un tercer plano de scroll (procesos de tipo proceso_móvil).

Para ello, es importante que su z sea superior al resto de los procesos (z=100;) y que la prioridad del proceso que controla la cámara sea mayor (priority=100;) y este último utilice la función move_scroll() antes de cada imagen (FRAME;).

Los procesos que simula el tercer plano (proceso_móvil), sitúan su coordenada x en función de la x del scroll y su posición original.

La diferencia es que si no se hubiera utilizado move_scroll(), al utilizar los procesos la variable scroll.x0 sin actualizar, se moverían con un cierto retraso que restaría verosimilitud al juego.


Ver: start_scroll() - Estructura scroll - priority - z