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.