Pausas y tiempo real
Aunque las aventuras, generalmente, están basadas en turnos, es
posible -y en realidad bastante sencillo, una vez que te has
familiarizado con la entrada por ratón y por hiperenlaces- incorprar
eventos de tiempo real en tu juego. Esto puede estar bien para, por
ejemplo, mover a los personajes, que entren y salgan de la localidad
mientras el jugador está pensando qué comando dar después, o para
implementar una bomba que el jugador realmente deba desactivar en unos
segundos. También pueden usarse en conjunción con gráficos para crear
animaciones.
El comando para lanzar un evento de tiempo real es
glk_request_timer_events()
, con un número entre los paréntesis, que
representa el número de milisegundos que transcurrirán entre los
sucesivos eventos de tiempo real. Es decir, cuando el programa llega a
una línea que dice glk_request_timer_events(1000)
, se ejecutará el
código apropiado de HandleGlkEvent()
cada 1000 milisegundos, o sea,
cada segundo. Detectar este tipo de evento es muy similar a los del
ratón o los hiperenlaces, símplemente equipa a tu rutina
HandleGlkEvent()
con algo como lo siguiente:
[ HandleGlkEvent ev contexto;
switch (ev-->0) {
evtype_Timer:
! Aqui pones el codigo a ejecutar cada cierto tiempo
}
];
|
La principal diferencia entre estos eventos y los de raton o de
hiperenlace, es que no necesitas solicitar de nuevo un evento de
tiempo real cada vez que has consumido uno: el programa
seguirá generandolos automáticamente hasta que le digas explícitamente
que ya no genere más, con la línea glk_request_timer_events(0);
Así que, ¿cómo harías una animación? La clave es sacar partido del
hecho de que, si enumeras cada cuadro de la animación de forma
correlativa en tu fichero de recursos Blorb, las constantes que se les
asignarán serán números secuenciales. Así que si tienes una animación
con siete cuadros, cada cuadro podría recibir los números 3, 4, 5, 6,
7, 8 y 9, por ejemplo. Pero no necesitas saber qué números son, basta
que crees un contador global para los cuadros y le asignes como valor
inicial el del primer cuadro:
cuenta_cuadros = Primer_Cuadro;
|
Después, pon un código como el siguiente en la rutina HandleGlkEvent()
:
switch (ev-->0) {
evtype_Timer:
if (cuenta_cuadros > Ultimo_Cuadro) glk_request_timer_events(0);
else {
glk_image_draw(gg_ventana_anim, cuenta_cuadros, 0, 0);
cuenta_cuadros++;
}
}
|
Este código mostrará primero el primer cuadro, después el segundo,
después el tercero, etc. hasta llegar al séptimo, y después parará. Es
cosa tuya asegurarte de que esto ocurra a una velocidad razonable -
intenta diferente número de milisegundos desde tu
glk_request_timer_events()
y mira cuál queda mejor.
Ahora, si lo único que quieres es una pausa hasta que el jugador pulse
una tecla, la cosa es mucho más sencilla. Hay un comando llamado
KeyCharPrimitive()
que espera por una tecla. Si pones en tu código
la línea x = KeyCharPrimitive();
el juego esperará a que el jugador
pulse una tecla, y después pondrá el valor de la tecla pulsada en la
variable x
. Un interesante efecto secundario es que puedes usar
KeyCharPrimitive()
a solas para causar una pausa en la salida, y
esperar hasta que el jugador pulse una tecla antes de continuar. Por
ejemplo, supón que quieres hacer una pausa antes de una revelación
dramática:
print "~He considerado todas las pruebas~, dice el detective,
~y todo apunta en una dirección. El asesino fue...";
KeyCharPrimitive();
print " ¡yo! Lo siento, no volverá a ocurrir.~";
|