Finestre Glk

Quando avviate un interprete Glulx, che chiameremo "Glulxe" da adesso in poi, il sistema operativo del vostro computer gli riserverà una certa parte dello schermo. Questa potrebbe essere semplicemente un'altra finestra tra le tante, come su Windows o sul Mac; oppure potrebbe essere l'intero schermo, come in DOS, che esegue un solo programma alla volta. Ad ogni modo, per quel che interessa al gioco IF, lo spazio allocato a Glulxe è il mondo intero. Il gioco non sa niente di quello che c'è fuori dallo spazio di schermo di Glulxe, e non può alterare nulla al di fuori dello stesso.

All'inizio, all'interno dello spazio di schermo di Glulxe non c'è niente. E niente può esserci messo, fino a che una finestra Glk viene aperta. Una finestra Glk è una porzione dello spazio di schermo di Glulxe in cui si possono visualizzare cose e da cui, a volte, è possibile accettare degli input. Ci sono tre tipi di finestre che il programmatore deve conoscere:

I dettagli su come usare questi tipi di finestra verranno illustrati nelle sezioni seguenti. Il resto di questa sezione riguarderà il come crearle e come costruire un layout di finestre personalizzato per il vostro gioco.

Due finestre vengono create automaticamente dalla libreria (sebbene questo possa essere evitato usando il punto di partenza InitGlkWindow(). Fra poco ne sapremo di più). La prima finestra è una finestra di testo chiamata "gg_mainwin", che riempie l'intero spazio di schermo di Glulxe. Questa è suddivisa in due, con una finestra a griglia di testo chiamata "gg_statuswin" che occupa una riga alla cima dello schermo di Glulxe, e gg_mainwin che occupa il resto.

Se volete aggiungere altre finestre, qui c'è come farlo. Prima di tutto bisogna decidere che tipo di finestra deve essere. Forse volete una mappa disegnata del mondo di gioco che sia sempre visualizzata sullo schermo. Questo porta a scegliere una finestra grafica. Poi bisogna scegliere un nome per la finestra. La potete chiamare come volete, ma visto che la libreria chiama le finestre tutte con il prefisso "gg_", forse è il caso che lo facciate anche voi. Così la finestra si chiamerà "gg_mapwin".

Poi dobbiamo scegliere un "rock value" per questa finestra. Questo deve essere un numero pari a 210 o superiore. (Se non sapete ancora che cosa è un "rock value" non vi scoraggiate -- scegliete semplicemente il numero 210 o superiore (che non sia stato usato in un'altra finestra) ed andate avanti). Per questo esempio sceglieremo il numero 210. Il passo è quello di aggiungere un paio di righe al nostro codice. All'interno della vostra lista di costanti, aggiungete questa riga:

   Constant GG_MAPWIN_ROCK 210;

ed all'interno della vostra lista di variabili globali, questa:

   Global gg_mapwin = 0;

Con queste righe aggiunte al codice siamo ora in grado di creare la nostra nuova finestra. Il comando chiave è glk_window_open(). All'interno delle parentesi ci vanno cinque parametri:

1) Il primo è il nome della finestra da dividere in due parti. In questo caso stiamo dividendo la finestra principale, quindi usiamo "gg_mainwin".

2) Poi ci va il metodo che usiamo per dividere la finestra. Questo si ottiene con un processo in due parti. Prima dobbiamo scegliere una delle seguenti quattro opzioni:

Poi dobbiamo scegliere una delle seguenti opzioni:

Unitele con un segno di addizione (+). Così se abbiamo deciso che la mappa deve stare permanentemente nella parte sinistra dello spazio di schermo di Glulxe, e sappiamo che la mappa è larga 240 pixel, probabilmente andremo a scegliere "(winmethod_Left+winmethod_Fixed)". E il "240" dove va? Beh, va nella...

3) ...terza posizione, dove mettiamo: il numero di righe o colonne da riservare per la nuova finestra (se è una finestra di testo, ed abbiamo scelto l'opzione winmethod_Fixed); il numero di pixel da riservare per la nuova finestra (se è una finestra grafica, ed abbiamo scelto winmethod_Fixed); o, se abbiamo scelto winmethod_Proportional, la percentuale della vecchia finestra da riservare per la nuova (ad esempio, avremmo messo "50" se avessimo voluto dividere la vecchia finestra a metà, oppure "33" se avessimo voluto riservare 1/3 dello spazio di schermo della vecchia finestra per la nuova).

4) Qui inseriamo il tipo di finestra che vogliamo: wintype_TextBuffer, wintype_TextGrid o wintype_Graphics. Nel nostro esempio vogliamo usare l'ultimo dei tre.

5) L'ultima posizione riguarda la lista delle costanti che abbiamo dichiarato in precedenza. In questo caso deve essere GG_MAPWIN_ROCK.

Questo ci porta ad avere la seguente chiamata:

   gg_mapwin = glk_window_open(gg_mainwin, (winmethod_Left+winmethod_Fixed),
      240, wintype_Graphics, GG_MAPWIN_ROCK);

Naturalmente il semplice inserimento di una riga come questa nel vostro programma tutta da sola è una pessima idea -- ci sono una serie di condizioni che dovete controllare. Tanto per dirne una, prima di aprire una finestra è necessario assicurarsi che la finestra non sia già aperta. Perché dovrebbe? Forse perché il giocatore ha appena caricato un gioco salvato (che non ripristina automaticamente la configurazione della finestra dal momento del salvataggio: dovete pensarci per conto vostro. Come fare verrà spiegato tra breve). Così inseriamo il tutto in una condizione:

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

Inoltre bisogna tenere presente che la richiesta di apertura di una finestra non è detto che vada a buon fine. Il giocatore potrebbe stare usando un interprete che non supporta la grafica, ad esempio, nel qual caso il tentativo di aprire una finestra grafica è destinato a fallire. O forse l'interprete supporta la grafica, ma il giocatore ha impostato l'intero spazio di schermo di Glulxe ad essere largo meno di 240 pixel, così la finestra che ottenete non è esattamente quella alla quale avevate pensato. Certamente vorrete controllare questo tipo di cose; quello che fare in base ai risultati di questi controlli sta a voi. Ad esempio, se il vostro gioco è incomprensibilmente senza grafica, allora dovreste controllare se la finestra grafica è stata aperta realmente (con un test tipo "if (gg_graphics1win == 0)" dopo la chiamata a glk_window_open()) e, se non lo è, visualizzare un messaggio come "Questo gioco ha bisogno di un interprete in grado di visualizzare la grafica. Spiacente!" ed uscire dal gioco. Ma se la grafica è semplicemente una divertente aggiunta, allora dovreste far continuare il vostro gioco, ma dovreste assicurarvi di non cercare di usare glk_image_draw() per mettere un'immagine in quella (inesistente) finestra dopo non essere riusciti ad aprirla -- eseguite un controllo tutte le volte.

Per chiudere una finestra si usa il comando glk_window_close(). Questo richiede due argomenti. Il primo è il nome della finestra da chiudere. Il secondo è estremante esoterico; metteteci semplicemente 0 e vivete felici.


Prossima sezione: Stili del testo
o ritorna al sommario