Entrada/Salida a ficheroOtros trucosHiperenlacesPausas y tiempo real

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.~";


Entrada/Salida a ficheroOtros trucosHiperenlacesPausas y tiempo real