Immaginate di avere un gioco ambientato in una cittadina del vecchio West, e quando il protagonista entra in città passa vicino ad un cartello che dice "Dead Dog, Kansas, Popolazione 213" scritto con vernice scolorita su del legno stagionato a cui hanno sparato. Il giocatore non sa cosa c'è scritto fino a che non digita "ESAMINA IL CARTELLO" -- la descrizione della stanza ha solo la riga "Vedi un cartello qui", o simile, ad indicare la sua presenza. Ed immaginate di avere una grande immagine di un cartello stagionato che ha un paio di fori provocati da un fucile. Idealmente vorreste mostrare l'immagine se l'interprete del giocatore fosse in grado di gestire la grafica, o scrivere un paragrafo che descrive il cartello in caso contrario. È per questo che esiste glk_gestalt().
Ci sono più di una dozzina di cose che potete testare. In questo caso, la costante da usare deve essere gestalt_Graphics, e l'oggetto cartello dovrebbe essere come questo:
Object cartello "cartello stagionato" with name 'stagionato' 'cartello', description [; if (glk_gestalt(gestalt_Graphics, 0)) { ! inserire il codice per mostrare l'immagine del cartello } else "Il cartello dice ~DEAD DOG, KANSAS, POP. 213.~ O forse potrebbero essere 2130, o 21300 -- qualcuno ha fatto saltar via l'angolo del cartello con un fucile."; ], has static;
(Fate caso allo 0 nella chiamata a glk_gestalt -- è obbligatorio. glk_gestalt richiede due argomenti, anche nel caso in cui il secondo non serve a niente).
Qui ci sono le diverse costanti che si possono usare con glk_gestalt:
Costante | 2ndo arg | Cosa restuisce |
---|---|---|
gestalt_Version | 0 | Un numero a 32 bit con il numero di versione di Glk codificato (primi sedici bit = numero di versione major, successivi otto = numero minor, ultimi otto = numero sub-minor, così 0.6.1 sarebbe 00000601 hex.) |
gestalt_CharOutput | il codice del carattere da testare (nota) | Serve a verificare se un particolare carattere (come una "n" con una tilde sopra) può essere stampato sulla piattaforma del giocatore. Restituisce una di queste tre costanti: gestalt_CharOutput_ExactPrint se può, gestalt_CharOutput_CannotPrint se non può, o gestalt_CharOutput_ApproxPrint se lo converte in qualcos'altro (come una normale "n" per la n-con-tilde, o "ae" per ae-con-legatura.) |
gestalt_LineInput | il codice del carattere da testare | Come sopra, ma per vedere se un carattere può essere accettato durante l'input di una riga (cioè, l'input che viene trattato quando si preme il tasto Invio.) |
gestalt_CharInput | il codice del carattere da testare | Come sopra, ma per vedere se un carattere può essere accettato durante l'input di un carattere (cioè, l'input che viene trattato un carattere alla volta.) |
gestalt_MouseInput | il tipo di finestra da testare | 1 se l'input da mouse è supportato, 0 se no. |
gestalt_Timer | 0 | 1 se il tempo reale è supportato, 0 se no. |
gestalt_Graphics | 0 | 1 se la grafica è supportata, 0 se no. |
gestalt_DrawImage | il tipo di finestra da testare | Serve a testare in maniera specifica se le immagini possono essere posizionate in un particolare tipo di finestra (wintype_TextBuffer o wintype_Graphics). 1 se è possibile, 0 se no. |
gestalt_GraphicsTransparency | 0 | Serve a testare se le immagini PNG con aree trasparenti vengono realmente mostrate con la trasparenza funzionante come dovrebbe. 1 se funziona, 0 se no. |
gestalt_Sound | 0 | 1 se il suono è disponibile, 0 se no. |
gestalt_SoundMusic | 0 | 1 se possono essere suonati i MOD, 0 se no. (Può valere 0 anche se glk_gestalt(gestalt_Sound, 0); restituisce 1 -- in questo caso solo i suoni AIFF sono supportati.) |
gestalt_SoundVolume | 0 | 1 se glk_schannel_set_volume() è supportato, 0 se no. |
gestalt_SoundNotify | 0 | 1 se la routine HandleGlkEvent() può eseguire codice personalizzato nel momento in cui un suono termina l'esecuzione, 0 se no. |
gestalt_Hyperlinks | 0 | 1 se i collegamenti ipertestuali sono supportati, 0 se no. |
gestalt_HyperlinkInput | il tipo di finestra da controllare | 1 se i collegamenti ipertestuali sono supportati all'interno di un particolare tipo di finestra, 0 se no. |
Le sezioni che seguono spiegano come avvantaggiarsi di queste di queste capacità -- ma mentre leggete queste sezioni, ricordate che prima di poter visualizzare la grafica, o suonare della musica, o dichiarare un collegamento ipertestuale, o quello che volete, dovete prima usare glk_gestalt() per verificare se l'interprete del giocatore può fare queste cose. Se non può, dovete trovare dei metodi alternativi -- descrizioni testuali delle immagini, e cose così -- o almeno visualizzare un messaggio che dica al giocatore di quali caratteristiche l'interprete ha bisogno per poter usare quel gioco. Idealmente dovreste controllare il risultato di gestalt tutte le volte che usate le capacità opzionali di Glk -- se fate questo controllo solo in Initialise(), vi esponete a problemi come quello che potrebbe accadere nel caso in cui il giocatore inizi a giocare con il vostro gioco sulla sua macchina desktop, poi salvi il gioco e prosegua la partita sul proprio palmare. (Questo non signica per forza che dovete digitare un sacco di chiamate a glk_gestalt() -- potreste, ad esempio, creare una routine MyGlkImageDraw() che esegua i controlli gestalt appropriati e poi visualizzi l'immagine che volete).