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:
- Ventanas de buffer de texto. Este tipo de ventanas
muestra texto, e incluso imágenes, pero lo hace en una forma de
"flujo" (stream). Esto es, cuando el juego le dice a la
ventana "imprime esta frase" o "muestra esta imagen", la frase o
la imagen son colocados justo después del texto o imágenes que
hubiera ya en esa ventana. Cuando la ventana de buffer de texto se
llena, el material más antiguo se desliza hacia arriba y desaparece
de la vista; en algunos intérpretes este material desaparece de la
pantalla para siempre, mientras que otros pueden proporcionar una
barra de desplazamiento que te permita retroceder páginas y ver
parte de lo que ha desaparecido. La ventana donde los jugadores
teclean sus comandos será normalmente una ventana de tipo buffer de
texto, salvo en los casos más excéntricos.
- Ventanas de rejilla de texto Este tipo de ventanas
también muestran texto, pero lo hacen en una forma diferente a las
ventanas de buffer de texto. Las ventanas de rejilla de texto
permiten al programador colocar los caracteres donde él quiera, como
si colocara fichas de Scrabble en el tablero. Esto las hace ideales
para el caso en que quieras sobreescribir información vieja, como en
la línea de estado que usan la mayoría de los juegos. Las ventanas
de rejilla de texto pueden aceptar entrada desde el teclado-
flechas arriba y abajo para mover la elección en un menú, por
ejemplo - pero intentar algo más avanzado requeriría manipular un
poco la librería.
- Ventanas gráficas. Este tipo de ventana no puede
mostrar texto en absoluto, pero a cambio permiten al programador
mostrar imágenes (en formato JPEG o PNG) que no "deslizarán" hacia
arriba a medida que el juego progrese. El programador puede incluso
crear sus propias imágenes usando los comandos de dibujo de Inform
Glulx, si tiene la paciencia necesaria. Las ventanas gráficas no
pueden aceptar entrada desde el teclado, pero pueden reconocer las
pulsaciones del ratón (una interesante capacidad, que comparten con
las ventanas de tipo rejilla de texto).
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:
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:
- 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í.
- 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:
winmethod_Above
: divide la ventana en dos partes, una encima
de otra, y la nueva ventana será la parte superior (en inglés,
above es "encima")
winmethod_Below
: divide la ventana en dos partes, una encima
de otra, y la nueva ventana será la parte inferior (en inglés,
below es "debajo")
winmethod_Left
: divide la ventana en dos pates, una al lado
de la otra, y la nueva ventna será la parte de la izquierda
(left en inglés)
winmethod_Right
:divide la ventana en dos pates, una al lado
de la otra, y la nueva ventna será la parte de la derecha
(right en inglés)
Después tienes que elegir una de las opciones siguientes:
winmethod_Fixed
: reserva un cierto número de líneas o
columnas (para las ventanas tipo texto), o de pixels (para las
ventanas gráficas) para la nueva ventana.
winmethod_Proportional
: reserva un cierto porcentaja de la
ventana original para la nueva ventana.
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...
- ...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).
- 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.
- 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.