TECNICAS AVANZADAS DE PROGRAMACION DE AVENTURAS Programación con el sistema SINTAC

Por: Javier San José

Gráficos, de eso vamos a hablar en esta entrega. Como ya sabréis la nueva versión G1 del SINTAC incorpora nuevos condactos para incluir gráficos en vuestras aventuras. En este artículo daré unos cuantos consejos para aquellos que os decidáis a incorporar algún elemento gráfico.

Lo primero recordar que el SINTAC soporta dos modos de pantalla accesibles mediante el condacto MODE. El modo 0 es un modo de alta resolución de 640x480 a 16 colores mientras que el modo 1 es un modo de media resolución de 320x200 a 256 colores.

En principio os aconsejaría que trabajéis siempre que podáis en el modo 1. Esto es así por dos razones claras. La primera es que se dispone de una paleta de 256 colores y, aunque se pierde resolución, se gana en espectacularidad. Esto no quiere decir que los gráficos de 16 colores sean malos, he visto auténticas maravillas a 16 colores solo que al tener 256 colores podéis trabajar más cómodamente.

En segundo lugar el modo 1 presenta una velocidad de salida por pantalla netamente superior al modo 0. Esto en ordenadores lentos es crucial, aunque he de decir que las rutinas se han optimizado en lo posible para obtener la mejor velocidad.

El modo 0 sólo lo aconsejaría a aquellos que precisen de los 80 caracteres por línea.

El segundo parámetro del condacto GRAPHIC tiene también sus peculiaridades. Con este parámetro podemos hacer, básicamente, que el gráfico se vaya dibujando según se lee del disco (valor 0) o que se ponga la pantalla en negro y el gráfico se dibuje al final (valor 1).

Un buen consejo es que uséis el segundo caso (parámetro 2 igual a 1) para la pantalla de presentación o para dibujar la zona de juego. En cambio para los gráficos que se presentan en mitad de la aventura es conveniente usar el valor 0, es decir, que el gráfico se vaya dibujando según se lee del disco.

El valor 2, con el cual el gráfico se dibuja sin modificar la paleta de colores, es adecuado si habéis dibujado la zona de juego y queréis presentar un gráfico sin que se modifiquen bruscamente los colores; aunque lo más recomendable es establecer la misma paleta para todos los gráficos a la hora de dibujarlos en el programa de dibujo.

En cuanto a los programas de dibujo considero que el mejor es el Deluxe Paint. Aunque este programa usa el formato LBM, también puede grabar los gráficos directamente en formato PCX. Además, y esto para los que hayáis usado alguna vez este programa, se puede grabar sólo una zona de la pantalla capturándola como un pincel y usando la opción Salvar del menú Pincel. Cuando aparezca la ventana para introducir el nombre del fichero elegid el formato PCC (arriba a la derecha) e indicad el nombre del fichero. La zona elegida se grabará en un fichero con extensión .PCC que no es más que un fichero en formato PCX. Ya sólo tenéis que renombrarlo y ponerle la extensión .PCX, y ya está.

El condacto REMAPC nos ayudará a conseguir efectos especiales. Por ejemplo suponed que tenemos una pantalla en la que se ha dibujado un coche de policía con su correspondiente sirena. Vamos a ver como hacer que la luz de la sirena parpadee con un sencillo Proceso.

El color de la luz, inicialmente es el azul oscuro que corresponde en nuestra paleta al número de color 10. Este color viene representado por tres componentes RGB que son (0 0 34). Para el efecto de luz parpadeante usaremos otros dos tonos más claros de azul cuyas componentes RGB son, respectivamente, (0 0 47) y (0 0 63).

El efecto de luz parpadeante lo producirá el siguiente proceso:

\PRO 5

     _    _    LET 100 0

     $sirena
     _    _    REMAPC 10 0 0 47
               PAUSE 5
               REMAPC 10 0 0 63
               PAUSE 5
               REMAPC 10 0 0 34
               PAUSE 5

     _    _    INC 100
               LT 100 10
               SKIP $sirena

     \END

Con esto conseguimos que el color número 10 de la paleta, con el que está dibujado la sirena, cambie de un azul oscuro a un azul más claro. Esto se repite 10 veces antes de salir del bucle. La variable 100 se usa como contador. Hay que tener en cuenta que si hay otro objeto en la pantalla cuyo color es el 10, también parpadeará por lo que hay que tener cuidado con esto.

Espero que estos consejos os
sirvan de utilidad cuando os pongáis a trabajar con gráficos.

Ahora vamos a ver un buen ejemplo del uso de la potencia del SINTAC para programar una rutina que nos imprima una lista de salidas separadas por comas y las dos últimas por "y". Usaremos constantes simbólicas que nos faciliten el trabajo de modificar la rutina de acuerdo a nuestras necesidades. Las constantes simbólicas usadas aparecen definidas al principio de la rutina (en este caso el proceso 100) y son:

     MSG_SALIDA: nº de mensaje del sistema con el texto
     "Salidas:"
     MSG_COMA: ídem para el texto ", "
     MSG_Y: ídem para el texto " y "
     MSG_PUNTO: lo mismo pero para el texto ".|"
     MSG_NINGUNA: texto "ninguna"
     MSG_NORTE: texto "Norte"
     MSG_SUR: texto "Sur"
     MSG_ESTE: texto "Este"
     MSG_OESTE: texto "Oeste"

Además vamos a usar las variables 253 a 255 y las banderas siguientes para indicar las conexiones que parten de la localidad actual:

     255: indica si hay salida hacia el norte
     254: indica si hay salida hacia el sur
     253: indica si hay salida hacia el este
     252: indica si hay salida hacia el oeste

En caso de querer añadir más salidas habría que reservar una bandera adicional para cada una, a partir de la bandera 251 y de ahí hacia abajo (251, 250, 249,...), además de su correspondiente mensaje del sistema empezando por MSG_OESTE y de ahí hacia arriba. Esto que parece un poco lioso (y en realidad lo es) facilitará el trabajo de asociar a cada salida su mensaje correspondiente.

Básicamente la rutina hace lo siguiente. Primero se inicializan algunas variables y banderas. Luego se comprueban todas las salidas a partir de la localidad actual (variable 1) y se activa la bandera correspondiente si hay salida. Además incrementamos las variable 254 por cada salida que haya para saber cuantas salidas tiene la localidad.

Al final comprobamos el valor de la variable 254. Si es 0 es que no hay ninguna salida e imprimimos el mensaje "Salidas: ninguna" y salimos del proceso.

Damos a la variable 255 el número del mensaje del sistema que corresponde a la primera salida (Norte) y a la variable 253 el número de bandera de la primera salida (la bandera 255) y entramos en un bucle. En cada pasada del bucle se incrementa la variable 255 (nº de mensaje) y se decrementa la 253 (nº de bandera) y la 254 (nº de salidas). En este bucle vamos comprobando todas las banderas correspondientes a las salidas y si alguna está activada imprimimos el mensaje correspondiente a esa salida.

Si quedan sólo 2 salidas imprimimos después " y ", si quedan más de 2 imprimimos ", ". Cuando ya sólo queda una salida imprimimos el punto final y abandonamos el proceso.

En fin, el proceso que lleva a cabo todo este "tinglado" es el siguiente:

\PRO 100
; Imprime una lista de salidas de la localidad actual
; Variables usadas: 253, 254, 255
; Banderas usadas: 255, 254, 253, 252

\\MSG_SALIDAS  200
\\MSG_COMA     201
\\MSG_Y        202
\\MSG_PUNTO    203
\\MSG_NINGUNA  204
\\MSG_NORTE    205
\\MSG_SUR      206
\\MSG_ESTE     207
\\MSG_OESTE    208

_    _    SYSMESS MSG_SALIDAS
          LET 254 0      ; variable 254 = nº de salidas
          CLEAR 255      ; bandera 255 = salida NORTE
          CLEAR 254      ;    "    254 =   "    SUR
          CLEAR 253      ;    "    253 =   "    ESTE
          CLEAR 252      ;    "    252 =   "    OESTE

_    _    LET 255 [1]
          SYNONYM NORTE NORTE
          MOVE 255
          SET 255
          INC 254

_    _    LET 255 [1]
          SYNONYM SUR SUR
          MOVE 255
          SET 254
          INC 254

_    _    LET 255 [1]
          SYNONYM ESTE ESTE
          MOVE 255
          SET 253
          INC 254

_    _    LET 255 [1]
          SYNONYM OESTE OESTE
          MOVE 255
          SET 252
          INC 254

_    _    EQ 254 0       ; si no hay salidas en esta localidad
          SYSMESS MSG_NINGUNA
          SYSMESS MSG_PUNTO
          DONE

_    _    LET 255 MSG_NORTE   ; mensaje de primera salida
          LET 253 255         ; bandera de primera salida


; NOTA: los mensajes de las salidas deben estar colocados en
; orden creciente empezando por MSG_NORTE, y las banderas
; usadas para indicar que hay conexión en orden decreciente
; y empezando por 255

$imp_salidas

_    _    ZERO [253]     ; si no hay conexión en esa dirección
          DEC 253        ; siguiente bandera de conexión
          INC 255        ; siguiente mensaje
          SKIP $imp_salidas

_    _    NOTZERO [253]  ; si hay conexión en esa dirección
          SYSMESS [255]  ; imprime mensaje
          DEC 253        ; siguiente bandera de conexión
          INC 255        ; siguiente mensaje

_    _    EQ 254 1
          SYSMESS MSG_PUNTO
          DONE

_    _    EQ 254 2
          SYSMESS MSG_Y
          DEC 254
          SKIP $imp_salidas

_    _    SYSMESS MSG_COMA
          DEC 254
          SKIP $imp_salidas

\END

Como veis es bastante fácil conseguir potentes rutinas haciendo buen uso de las posibilidades del SINTAC. Ahora os dejo para que vayáis mirando este proceso. Hasta la próxima.