Estilos de textoCómo hacer cosas con Glulx InformTest de capacidadesVentanas Glk

Ventanas Glk

Cuando arrancas un intérprete Glulx, que llamaremos "Glulxe" de ahora en adelante, el sistema operativo de tu ordenador reservará un trozo de la pantalla para él. Esto puede ser simplemente una ventana más entre otras, como en Windows o en el Mac; o alternativamente puede ser la pantalla completa, como en DOS, que sólo puede ejecutar un programa de cada vez. Sea como sea, en lo que concierne al juego, el espacio reservado para Glulxe es el mundo completo. El juego no sabe de y ni puede afectar a nada de lo que está fuera del espacio de pantalla de Glulxe. Dentro del espacio de pantalla de Glulxe, al principio, no hay nada. Y no puede ponerse nada allí hasta haber creado una ventana Glk. Una ventana Glk es una porción del espacio de pantalla de Glulxe, que puede mostrar cosas y a veces aceptar input. Hay tres tipos de ventanas que el programador de juegos debe conocer: Los detalles de cómo usar cada uno de estos tipos de ventana serán cubiertos en las secciones siguientes. El resto de esta sección tratará de cómo crear y construir una disposición de ventanas personalizada para tu juego. Hay dos ventanas que son cradas por la librería InformATE automáticamente (aunque esto puede evitarse programando una función llamada InitGlkWindow(), enseguida veremos más sobre esto). La primera ventana es una ventana de buffer de texto, llamada gg_mainwin, que llena todo el espacio de pantalla de Glulxe. Esta ventana es inmediatamente dividida en dos, con una ventana de rejilla de texto llamada gg_statuswin ocupando una línea en la parte superior del espacio de pantalla de Glulxe, y gg_mainwin ocupando el resto. Si quieres añadir más ventanas, lo que tienes que hacer es esto. Primero, decide qué tipo de ventana deberá ser. Quizás quieras un dibujo de un mapa del mundo del juego, visible permanentemente en la pantalla. Esto requeriría una ventana gráfica. Después, piensa un nombre para la ventana. Puedes ponerle cualquiera, pero ya que la librería empieza todos los nombres de ventana con gg_, puedes hacer lo mismo tú tambien. De modo que la llamaremos gg_mapawin. Ahora tienes que elegir un "valor roca" para esta ventana. Este ha de ser un número cualquiera mayor o igual a 210. (Si no sabes qué es un "valor roca", no te desanimes - simplemente elige un número mayor o igual a 210, que no hayas usado ya para otra ventana, y prosigue). Para este ejemplo, elegiremos el 210. El siguiente paso es añadir un par de líneas a tu código. En la zona donde defines constantes, pon esta línea:

Constant GG_MAPAWIN_ROCA 210;

y en tu zona de variables globales, pon esta línea:

Global gg_mapawin = 0;

Con estas líneas añadidas al código, estamos preparados para crear realmente nuestra nueva ventana. La instrucción clave aquí será glk_window_open(). Dentro de los paréntesis van cinco parámetros:

  1. Primero, el nombre de la ventana que hay que partir en dos. En este caso partiremos la ventana principal, así que pondremos gg_mainwin aquí.
  2. Después, el método que queremos usar para partir la ventana. Este es un proceso en dos partes. Primero, necesitarás elegir uno de los siguientes cuatro métodos: Después tienes que elegir una de las opciones siguientes: Junta estas dos elecciones con un signo +. Así, por ejemplo, si queremos que el mapa del juego aparezca a la izquierda del espacio de pantalla de Glulxe, y sabemos que el mapa tiene 240 pixels de ancho, probablemente estaremos inclinados a usar (winmethod_Left+winmethod_Fixed). ¿Dónde va el 240? Vaya, es el...
  3. ...tercer argumento, donde podemos poner: bien el número de líneas o columnas que deben reservarse para la nueva ventana (si es una ventana de texto y se había elegido winmethod_Fixed); o el número de pixels que deben reservarse para la nueva ventana (si es una ventana gráfica y se había elegido winmethod_Fixed); o bien, si habíamos elegido winmethod_Proportional, el porcentaje de la ventana original que queremos reservar para la nueva ventana (por ejemplo, pondríamos 50 si quisiéramos dividir la ventana a la mitad, o 33 si quisiéramos reservar 1/3 del espacio que ocupaba la ventana original para la nueva ventana).
  4. A continuación, ponemos qué tipo de ventana queremos: wintype_TextBuffer para una ventana de tipo buffer de texto, wintype_TextGrid para una ventana de tipo rejilla de texto, o wintype_Graphics para una ventana gráfica. En este ejemplo, queremos el último caso.
  5. El último elemento de la lista es la constante que has declarado antes. En nuestro ejemplo, sería GG_MAPAWIN_ROCA
Esto nos deja la siguiente llamada:

gg_mapawin = glk_window_open(gg_mainwin,
                (winmethod_Left+winmethod_Fixed), 240, 
                 wintype_Graphics, GG_MAPAWIN_ROCA); 

Por supuesto, soltar una línea como esta en mitad de tu programa, es una mala idea. Hay que comprobar una serie de cosas antes. Para empezar, antes de abrir una ventana debes estar seguro de que la ventana no está ya abierta. ¿Cómo podría estarlo? Quizás el jugador acaba de restaurar una partida guardada (lo que no restaura automáticamente la configuración de ventanas que había en el momento de guardar la partida, esto tenes que hacerlo tú. Cómo hacer esto se explicará en breve). Así que envolvamos la línea en una condición:

if (gg_mapawin == 0) { 
  gg_mapawin = glk_window_open(gg_mainwin,
                   (winmethod_Left+winmethod_Fixed), 240, 
                    wintype_Graphics, GG_MAPAWIN_ROCA); 
  }  

Otra cosa a tener en cuenta, es que sólo porque hayas pedido que se abra una ventna, eso no significa que realmente se haya abierto. El jugador podría estar usando un intérprete que no soporta gráficos, por ejemplo, en cuyo caso tu intento de crear una ventana gráfica estará condenado al fracaso. O puede que el intérprete soporte gráficos, pero que el jugador haya reducido la zona de pantalla de Glulxe a menos de 240 pixels de ancho, por lo que la ventana que obtienes no es exactamente la que habías pedido. Deberías comprobar estas cosas; pero lo que hagas con los resultados de las comprobaciones queda a tu criterio. Por ejemplo, si tu juego es incomprensible sin el gráfico, entonces deberías comprobar si tu ventana gráfica realmente se ha abierto (con un test del tipo "if (gg_mapawin == 0)" y, si no se abrió, imprimir un mensaje como "Este juego necesita un intérprete capaz de mostrar gráficos. ¡Lo siento!" y finalizar el juego. Pero si el gráfico no es más que un añadido sin importancia, entonces podrías querer que el juego prosiguiera, pero en ese caso asegúrate de que no intentas nunca hacer un glk_image_draw() para poner una imagen en esa (inexistente) ventana - comprueba si la ventana es cero cada vez. Para cerrar una ventana, usa el comando glk_window_close(). Esta rutina necesita en realidad dos argumentos. El primero es el nombre de la ventana a cerrar. El segundo es extremadamente esotérico; si simplemente pones 0, todo irá bien.


Estilos de textoCómo hacer cosas con Glulx InformTest de capacidadesVentanas Glk