Líneas de estadoCómo hacer cosas con Glulx InformVentanas GlkEstilos de texto

Estilos de texto

Como hemos dicho antes, aquellos que quieran compilar sus juegos (preexistentes en forma de código fuente Inform) para GLulx, tienen que asegurarse de haber reemplazado cualquier instrucción de ensamblador Z, por ensamblador Glulx (o llamar a rutinas de Inform Glulx que hagan lo que antes hacía con el ensamblador Z). El otro cambio importante que los programadores de juegos necesitarán hacer es reemplazar cualquier comando como style bold; y style underline; - Glulx no los reconoce. En su lugar, tienes que poner llamadas a los cambios de estilo Inform Glulx. Las llamadas Inform Glulx para cambios de estilo son muy similares a los cambios de estilo del Inform clásico. Usas el comando glk_set_style() con el estilo que quieres aplicar dentro de los paréntesis, y todo el texto que imprimas después de eso aparecerá en el estilo especificado. No hay forma de "desactivar" un estilo, como se haría en HTML con sus tags </estilo> - para volver a imprimir texto normal, simplemente inserta la línea glk_set_style(style_Normal);. Otras posibilidades son: Pero exactamente ¿qué aspecto tienen todos estos estilos? Varía con cada intérprete. style_Emphasized puede ser negrita, o cursiva, o simplemente de un color más brillante. Sin embargo el programador puede hacer sugerencias con respecto a varios aspectos de un estilo dado (incluyendo dos estilos que se dejan para que el propio programador los defina: style_User1 y style_User2). Algunos intérpretes harán caso de estas sugerencias; otros no. (Y algunos incluso les harán caso pero de forma incorrecta: la versión de Glulxe para DOS basada en Allegro, actuelmente pone los colores de fondo y letra al revés) De momento, no hay un gestalt_StyleHints o algo asi que pueda servir para saber si nuestras sugerencias son atendidas o ignoradas. Pero si crees que tendrás suerte, usa la rutina glk_stylehint_set(), que requiere los siguientes cuatro parámetros:
  1. El tipo de ventana sobre la que debe aplicarse esta sugerencia de estilo. Las opciones son wintype_TextBuffer, wintype_TextGrid o wintype_AllTypes (pero no wintype_Graphics, puesto que no puedes imprimir texto en una ventana gráfica).
  2. El estilo al que se aplica esta sugerencia de estilo.
  3. El aspecto del estilo que se quiere cambiar (la lista de ellos se verá en breve).
  4. El número o constante que indica qué se cambia en ese estilo y cómo.
El significado del cuarto argumento varía drásticamente dependiendo de lo que el tercer argumento indique. Así, "1" puede significar: "indentar el texto un poco", "negrita", "prácticamente negro" u otras cosas, según el contexto. Por tanto, el tercer y el cuarto argumento no deben ser tratados separadamente, sino en tándem. He aquí una tabla de las combinaciones que se admiten:
Aspecto (3er argumento) Valor (4o argumento)
stylehint_Indentation Aquí debe ir un número que significa "mueve el siguiente trozo de texto tantas unidades a la derecha" (un valor negativo lo mueve hacia la izquierda). ¿Cuánto es una unidad? Depende del intérprete.
stylehint_ParaIndentation Esto es como el anterior, pero sólo afecta a la primera línea de cada párrafo.
stylehint_Justification Aquí puede ir una de las siguientes constantes: stylehint_just_LeftFlush (justificación a la izquierda), stylehint_just_RightFlush (justificación a la derecha), stylehint_just_LeftRight (justificación completa) o stylehint_just_Centered (centrada).
stylehint_Size Aquí hay que poner un número, pero no un número absoluto, como el tamaño en puntos, sino relativo. 0 significa "el tamaño por defecto", los valores positivos incrementan el tamaño una cierta cantidad, y los negativos lo decrementan. Los incrementos no son necesariamente de la misma magnitud: si 0 es 12 puntos, y +1 es 14 puntos, +2 puede ser 18 puntos.
stylehint_Weight 0=normal, 1=negrita, -1 = ligera.
stylehint_Oblique 0=no cursiva, 1=cursiva.
stylehint_Proportional 0=usar fuente de ancho fijo (tipo courier), 1=fuente de ancho proporcional
stylehint_TextColor Este debe ser un número de 32 bits que representa el color usado. Es mucho más fácil, con diferencia, si escribimos el número en hexadecimal nota3.html, lo que se hace en la forma siguiente. Primero, escribe el signo dolar (que indica a Inform que lo que sigue es un número hexadecimal). Después escribe un número hexadecimal de dos cifras, de 00 a FF, que representa la cantidad de rojo presente en el color. Después viene otro número de dos dígitos hexadecimales que representa la cantidad de verde, y finalmente otro número de dos dígitos hexadecimales que representa la cantidad de azul. Así, $000000 sería el negro, y $FFFFFF sería el blanco, $FF0000 sería un rojo intenso, $FFC000 sería un bonito dorado, $C0C0FF un azul bebé, etcétera.
stylehint_BackColor Aquí va un número de 32 bits, exactamente como el anterior, sólo que en esta ocasión estás seleccionando el color del "papel" detrás del texto. Sin embargo, éste no es el color de fondo de la ventana, y los resultados serán extremadamente horribles en algunos intérpretes (screen.gif). Actualmente no hay sugerencia de estilo para cambiar el color de fondo la ventana; con suerte, se le añadirá sin tardar mucho.
stylehint_Reverse 0=imprimir normalmente, 1=imprimir el texto usando el color del fondo, y viceversa.
Así que, juntándolo todo, pongamos que quieres definir el estilo "User1" como texto rojo sobre un fondo negro. Esto se lograría con el código siguiente:

glk_stylehint_set(wintype_TextBuffer, style_User1,
                  stylehint_TextColor, $FF0000); 
glk_stylehint_set(wintype_TextBuffer, style_User1, 
                  stylehint_BackColor, $000000); 

Sin embargo, las sugerencias de estilo sólo afectan a las ventanas que se crean a partir de entonces. Esto significa que si quieres usarlas, debes hacerlo antes de crear la ventana en la que quieres que se usen. Y puesto que la ventana gg_mainwin es creada por la libreria, si quieres que las sugerencias de estilo tengan efecto sobre la ventana principal del juego, ponerlas en Inicializar sería demasiado tarde - necesitas programar una rutina llamada InitGlkWindow(). Esta rutina es llamada desde la librería varias veces, y le pasa diferentes valores cada vez. En este caso, tienes que ejecutar tus sugerencias de estilo cuando el valor recibido sea igual al valor "roca" de gg_mainwin, así:

[ InitGlkWindow winrock; 
  switch (winrock) { 
     GG_MAINWIN_ROCK:
         glk_stylehint_set(wintype_TextBuffer, style_User1,
                           stylehint_TextColor, $FF0000); 
         glk_stylehint_set(wintype_TextBuffer, style_User1, 
                           stylehint_BackColor, $000000); 
     } 
  rfalse; ! si te olvidas esta linea, el juego no funcionará bien
];

Una última observación antes de proseguir. Podría parecerte que un código como este:

  print "Te he dicho que la violencia ";
  glk_set_style(style_Emphasized);
  print "no";
  glk_set_style(style_Normal);
  print " es la solución en este caso.";

es poco manejable. Lo es. Por otro lado no es mucho peor que:

  print "Te he dicho que la violencia ";
  style bold;
  print "no";
  style roman;
  print " es la solución en este caso.";

Por esto muchos programadores usan pequeñas rutinas para hacer todo esto más amigable. No es necesario escribir style_Emphasized un ciento de veces; algo como esto, lo haría perfectamente:

[ b texto;
  glk_set_style(style_Emphasized);
  print (string) texto;
  glk_set_style(style_Normal);
]

Y una vez que has creado esa rutina, puedes escribir el ejemplo de antes de esta otra forma:

   print "Te he dicho que la violencia ", (b) "no", 
         " es la solución en este caso.";
 


Líneas de estadoCómo hacer cosas con Glulx InformVentanas GlkEstilos de texto