Le pause ed il real time

Sebbene l'IF sia generalmente basata su una sequenza di turni, è possibile -- e, se avete familiarità con gli input del mouse ed i collegamenti ipertestuali, anche abbastanza semplice -- incorporare eventi in real time nel vostro gioco. La cosa può essere utile, ad esempio, per muovere i personaggi tra le stanze mentre il giocatore sta pensando alla prossima mossa da fare, o per implementare una bomba che il personaggio del giocatore deve veramente disinnescare in pochi secondi. Può essere usato anche in congiunzione alla grafica per creare delle animazioni.

Il comando per far partire un evento in real time è glk_request_timer_events(), con un numero tra le parentesi che indica il numero di millisecondi che trascorrono tra le chiamate a HanldeGlkEvent(). Questo significa che, ad esempio, quando il programma raggiunge la riga "glk_request_timer_events(1000);", andrà al posto appropriato in HandleGlkEvent() ogni 1000 millisecondi -- cioè, ogni secondo -- ed eseguirà il codice che vi troverà. L'inserimento del codice è molto simile a quello che viene fatto per gli input del mouse o i collegamenti ipertestuali -- semplicemente aggiungete alla vostra routine HandleGlkEvent() qualcosa simile a quello che segue:

   [ HandleGlkEvent ev context;
      switch (ev-->0) {
         evtype_Timer:
            ! qui ci va il codice da eseguire ad ogni intervallo
      }
   ];

La differenza principale dagli eventi del mouse e dei collegamenti ipertestuali è che non dovete effettuare la richiesta di un nuovo evento del timer ogni volta che sono passati N millisecondi: il programma continuerà ad andare a HandleGlkEvent() ripetutamente fino a che non gli dite esplicitamente di smettere con la riga "glk_request_timer_events(0);".

Allora, come si fanno le animazioni? Il punto chiave consiste nell'approfittare del fatto che se elencate i frame di ogni animazione in sequenza in un file di risorse Blorb, alle costanti che scegliete verranno assegnati dei numeri progressivi. Se avete un'animazione di sette frame, ai vostri frame potrebbero essere assegnati i numeri di risorsa Blorb 3, 4, 5, 6, 7, 8 e 9. Ma non avete bisogno di sapere quali siano i numeri -- dovete, invece, creare una variabile globale che conti i frame, ed inizializzarla con il primo di questi:

   frame_count = Primo_Frame;

Poi inserite un codice come questo nella vostra routine HandleGlkEvent():

   switch (ev-->0) {
      evtype_Timer:
         if (frame_count > Ultimo_Frame) glk_request_timer_events(0);
         else {
            glk_image_draw(gg_moviewin, frame_count, 0, 0);
            frame_count++;
         }
   }

Questo codice visualizza prima il frame uno, poi il frame due, quindi il frame tre, ecc., uno dopo l'altro fino al frame sette, e poi si ferma. È compito vostro assicurarvi che la cosa avvenga ad una velocità ragionevole -- provate con numeri di millisecondi differenti per la vostra chiamata a glk_request_timer_events() e vedete quello che funziona meglio.

Adesso se volete semplicemente fermare le cose fino a che il giocatore preme un tasto, la cosa è molto più facile. C'è un comando chiamato KeyCharPrimitive() che legge la pressione di un tasto -- se inserite la riga "foo = KeyCharPrimitive();" nel vostro codice, il gioco aspetta che il giocatore prema un tasto, e poi mette il valore del tasto premuto nella variabile "foo". Un simpatico effetto collaterale è che potete usare KeyCharPrimitive() da sola per fermare il flusso di output ed attendere che il giocatore prema un tasto prima di continuare. Ad esempio, diciamo che vogliate inserire una pausa prima di una rivelazione drammatica:

   print "~Ho preso in considerazione tutte le prove,~ dice il
      detective, ~e tutte portano in una direzione. L'omicidio è
      stato commesso da...";
   KeyCharPrimitive();
   print " me! Mi dispiace, non accadrà più.~";


Prossima sezione: File I/O [prossimamente]
O ritorna al sommario