start_mode7()

start_mode7(<número de m7>, <fichero>, <gráfico>, <gráfico exterior>,               <número de región>, <altura del horizonte>)

Descripción:

Ésta es una función avanzada que requiere que el usuario tenga cierta soltura para poder utilizarla.

Crea una ventana de visualización de un modo 7, es decir, visualiza un gráfico tridimensionalmente en un plano abatido; para conseguir este efecto se llamará a esta función con los siguientes parámetros:

<número de m7> - Se pueden crear hasta 10 ventanas de modo 7 en pantalla, con los número del 0 al 9; si únicamente 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 modo 7 se quiere alterar.

<fichero> - Los gráficos que se pretendan abatir en la 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 abatir en la ventana y debe pertenecer al fichero anteriormente indicado.

<gráfico exterior> - Aquí se puede indicar un 0 si no se quiere que se vea ningún gráfico más allá del gráfico abatido en la perspectiva, o bien un código de gráfico del mismo fichero que se mostrará en la perspectiva más allá del gráfico principal, hasta alcanzar el horizonte. Este gráfico debe ser de un ancho y alto potencia de dos, no mayor de 8192 (estas potencias de dos son: 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096 y 8192), por ejemplo, podría ser un gráfico de 64 puntos de ancho por 32 de alto; este gráfico se mostrará también abatido.

<número de región> - Aquí se indicará la región rectangular de pantalla en la que se va a mostrar el modo 7. 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_región() (una región no es más que una zona rectangular de la pantalla).

<altura del horizonte> - Como último parámetro se indicará a cuántos puntos desde la parte superior de la ventana se quiere situar la línea del horizonte. Si la cámara se sitúa por encima del plano abatido, entonces no se mostrará nada por encima de la línea del horizonte (ese hueco se suele rellenar con otra ventana de scroll o de modo 7); en cambio si la camara se sitúa por debajo del plano, entonces no se mostrará nada por debajo de la línea del horizonte.


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

  camera - Código identificador de la cámara
  height - Altura de la cámara
  distance - Distancia de la cámara
  horizon - Altura del horizonte
  focus - Focal de visión
  z - Plano de profundidad
  color - Color del exterior

Importante: El campo camera es imprescindible inicializarlo para que se active la ventana de modo 7 ya que, sin este campo, la ventana no puede determinar desde dónde se debe ver el plano abatido.

La cámara se situará en el plano abatido a la distancia (distance) indicada del proceso cuyo código identificador se haya puesto en camera, y mirando en su mismo ángulo (el que indique su variable local angle). La altura a la que se sitúa la cámara respecto al suelo será la indicada en el campo height.

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


Programa ejemplo:
PROGRAM ejemplo_start_mode7;

PRIVATE
    fichero1;

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

    start_mode7(0, fichero1, 4, 0, 0, 64);

    m7.height = 64;
    m7.distance = 32;
    m7.color = 162;
    m7.camera = id;

    write(0, 160, 0, 1, "Utilice los cursores para moverse");
    LOOP
        IF (key(_right)) angle-=8000; END
        IF (key(_left)) angle+=8000; END
        IF (key(_up)) advance(6); END
        FRAME;
    END
END


En el ejemplo se carga el fichero de gráficos y entonces se crea un modo 7 tridimensional con la función start_mode7(). A esta última se le pasan los siguientes parámetros:

0 - Número de ventana de modo 7 (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().

4 - Código del gráfico principal a abatir dentro del modo 7; 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 4.

0 - Código de gráfico secundario, con un 0 se indica que no habrá gráfico secundario (exterior) en el modo 7, luego el exterior se visualizará del color que indique la variable m7[0].color. Para observar el efecto de poner un gráfico exterior se puede cambiar este parámetro, por ejemplo, por un 100 (que es el código de una bola marrón de 32 por 32 puntos en el fichero help.fpg).

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

64 - Altura del horizonte, con este último parámetro se indica que la línea del horizonte se situará a 64 puntos del inicio superior de la ventana.

Tras llamar a la función start_mode7() el programa define los siguientes valores de la estructura global m7:

m7.height=64; - Para indicar que la cámara se debe situar a 64 puntos sobre el suelo.

m7.distance=32; - Para indicar que la cámara se debe situar 32 puntos por detrás del proceso cámara.

m7.color=162; - Para indicar que el exterior se debe visualizar del color número 162 de la paleta.

m7.camera=id; - Para indicar que el proceso cámara será el proceso actual.

La cámara se situará 32 puntos por detrás del proceso principal, a 64 puntos de altura y mirando en el ángulo que indique la variable angle del mismo.

Tras estas inicializaciones el programa ejemplo se quedará en un bucle que simplemente controla con los cursores el ángulo (angle) del proceso principal, que será el ángulo de la cámara y, cuando se pulse la tecla cursor arriba, se llamará a la función advance() para que el proceso principal avance 6 puntos (y por consiguiente la cámara del modo 7).


Cómo visualizar gráficos de procesos sobre el modo 7

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

  ctype=c_m7;

Una vez hecho esto el proceso se visualizará en el modo 7 con su gráfico (graph) escalado acorde a la distancia a la que esté. El proceso únicamente debe modificar sus variables x e y para moverse por el plano abatido.


Cuando un proceso pertenezca al modo 7 (se haya asignado el valor c_m7 a su variable local ctype):

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

  - Su variable z perderá su efecto, ya que los gráficos aparecerán ordenados por estricto orden de profundidad. Esta variable valdrá únicamente para indicar prioridades de impresión en gráficos que se sitúen, exactamente, en la misma profundidad del plano.

  - El proceso será eliminado automáticamente cuando se elimine la ventana de modo 7 a la que pertenece el proceso, con la función stop_mode7(), 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 modo 7.


Si hubiera varias ventanas de modo 7 el proceso se visualizaría por defecto en todas, si únicamente se tuviera que visualizar el algunas de ellas, se debería definir su variable local cnumber. Por ejemplo, si hubiera 6 ventanas de modo 7 (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 que un proceso tenga varios gráficos (varias vistas), dependiendo del ángulo desde el que se le mire, se debe definir su gráfico con la variable local xgraph (en lugar de la variable graph). Para definir esta variable primero se debe crear una tabla (de cualquier nombre) indicando en primer lugar el número de vistas del gráfico y después los códigos de los gráficos para estas vistas, comenzando por el ángulo 0 y en sentido contrario a las agujas del reloj. Por ejemplo:

  GLOBAL
    vistas_coche[]=4, 100, 101, 102, 103;

La tabla vistas_coche definiría 4 vistas: el gráfico 100 para ángulos próximos a 0 grados, el gráfico 101 para ángulos próximos a 90 grados, el 102 para ángulos próximos a 180 grados, etc.

Y después en el código del proceso se debería inicializar la variable xgraph con la siguiente sentencia:

  xgraph=OFFSET vistas_coche;

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 Speed for dummies).


Ver: stop_mode7() - Estructura m7