Ti trovi in: Magazine » Numero 7 » INFORM: La libreria sgw.h per Glulx


INFORM: La libreria sgw.h per Glulx

di Alessandro Schillaci

Per la comprensione di questo articolo sono richieste conoscenze minime di Inform. Non sono richieste, invece, conoscenze di Glulx.

INTRODUZIONE

La libreria Simple Glulx Wrapper (SGW) è una piccola e semplice libreria che estente le principali funzioni glulx per la gestione di elementi multimediali (immagini e suoni).
È sufficiente includere la libreria ed è possibile inserire immagini, suoni o musica, sfruttando le funzioni già predisposte per visualizzare un’immagine oppure riprodurre un suono (o una musica).

In questo modo è anche possibile prendere un’avventura scritta in Z-Code e convertirla in formato Glulx (con immagini e suoni) semplicemente importando la libreria nel file INF principale e utilizzando le funzioni disponibili, senza curarsi di aspetti tecnici quali ad esempio la sincronizzazione degli elementi multimediali nel caso di un RESTORE della partita in corso o di un RESTART.

Questa libreria deriva direttamente dal codice utilizzato per Little Falls, riassemblato da poter essere utilizzato a tutti gli effetti come una libreria.

Questa libreria definisce e prevede anche 3 canali audio da utilizzare nelle vostre avventure:

  • music : è il canale dedicato alla musica
  • chan1 : è il canale 1 per i suoni (effetti)
  • chan2 : è il canale 2 per i suoni (effetti)

Con questa libreria è possibile anche creare un’avventura testuale con suoni (senza immagini).

PRIMI PASSI

L’utilizzo della SGW è semplicissimo. Basta seguire questi punti:

  1. Aggiungere nel vostro file INF principale, questa direttiva di inclusione

    Include “sgw.h”;

    Prima di includere il parser (Include “Parser”;)

  2. Aggiungere la funzione

    initializeSGW(x);

    nella funzione Initialize() del vostro gioco. Questa funzione inizializza gli oggetti della libreria e crea una finestra grafica per le vostre immagini con altezza uguale a “x” pixels. Ovviamente è possibile utilizzare un altro alore per cambiare le dimensioni delle immagini.

  3. Creare un file di risorse con l’elenco delle immagini e dei suoni che intendete utilizzare nella vostra avventura.

  4. Ora è possibile riprodurre un suono o visualizzare un immagine in qualsiasi punto del codice Inform semplicemente utilizzando le funzioni:

    • viewImageLeft(image) : visualizza l’immagine allineata a sinistra
    • viewImageCenter(image, image_width) : visualizza l’immagine centrata nello schermo
    • viewImageRight(image, image_width) : visualizza l’immagine allineata a destra

    (dove image è l’identificativo indicato nel file delle risorse)

    Da notare che per centrare o per allineare a destra un’immagine, è necessario passare un ulteriore parametro alla funzione (image_width). Questo parametro è la larghezza (in pixel) dell’ immagine da centrare (allineare a destra).

    • playSound(channel,sound,lenght,volume) : dove channel=music oppure chan1 oppure chan2, sound=identificativo del suono nel file delle risorse, lenght è il numero di volte che il suono verrà riprodotto [-1 = all’infinito] e volume=VOLUME_HIGH oppure VOLUME_NORMAL oppure VOLUME_LOW)
  5. Questa libreria definisce i colori dei vari tipi di font (quelli usati per Little Falls). Ma è possibile cambiarli nel caso non siano di gradimento. Basta definire queste Costanti prima di inlcudere la libreria sgw (cioè prima della direttiva Include "sgw.h"; :

    Esempio:

    Constant SCBACK $110101;
    Constant SCTEXT $DDBB99;
    Constant SCSOFT $665544;
    Constant SCEMPH $FFFFDD;
    Constant SCHEAD $EEDDAA;
    Constant SCINPU $DDEEAA;
    
  6. Se volete utilizzare la libreria solo con il supporto audio, è possibile “inibire” l’inizializzazione grafica impostando questa costante prima di inlcudere la libreria:

    Constant NOGRAPHICS;
    

Ecco nel dettaglio tutte le funzioni che la SGW rende disponibili

Funzioni grafiche

  • clearMainWindow(): ripulisce la finestra principale
  • closeAllWindows(): chiude tutte le finestre grafiche
  • initializeSGW(h): imposta l’altezza della finestra grafica a h
  • viewImageLeft(image): visualizza l’immagine allineata a sinistra
  • viewImageCenter(image, image_width): visualizza l’immagine centrata nello schermo
  • viewImageRight(image, image_width): visualizza l’immagine allineata a destra

Funzioni audio

  • playSound(channel,sound,lenght,volume): riproduce un suono o musica
  • silenceAll(): azzera tutti i canali audio
  • silenceChannel(channel): azzera il canale audio “channel”
  • setVolume(val, channel): imposta il valore “val” per il volume

ESEMPIO

Ricreiamo un esempio completo (da zero) e vedrete che è più semplice a farsi che a dirsi. L’esempio in questione è compreso nella distribuzione della sgw, ma in queste pagine vedremo come costruirlo da zero.

Si presume che il lettore abbia installato sul suo sistema un compilatore INFORM e i tool Blorb (blb.exe e bres.exe).

Il file principale

Creiamo una nuova directory C:\test\ (per esempio). Creiamo un nuovo file con questo nome: sgw_test_it.inf (e salviamolo nella directory di test). Ecco il contenuto del file:

Constant Story "Test per sgw";  
Constant Headline "^Simple Glulxe Wrapper (sgw) 1.5 ^di 
                    Alessandro Schillaci^^";  
Include "sgw.h";    ! Inclusione della libreria SGW  
Include "Parser";  
Include "Infglk";  

Object LibraryMessages  
    with before [;  
        LMODE1 : lookmode =2; print "^"; rtrue;  
        LMODE2 : lookmode =2; print "^"; rtrue;  
        LMODE3 : lookmode =2; print "^"; rtrue;  
];  

Include "VerbLib";  
Include "Replace";  
Include "sgw_test_it.bli";  

Object room_1 "room 1"  
    with description [;  
        print "Una semplice stanza di esempio. Stanza 1. L'immagine è
               allineata a sinistra.^";
        viewImageLeft(room1);  
    ],  
    cant_go "Puoi muoverti solo a nord, verso la stanza 2.",  
    n_to room_2,  
    has light;  

Object room_2 "room 2"
    with description [;
        print "Una semplice stanza di esempio. Stanza 2. L'immagine è
               centrata.^";
        viewImageCenter(room2,620);             
    ],
    cant_go "Puoi muoverti a nord verso la stanza 3 oppure a sud, verso la
             stanza 1.",
    n_to room_3,
    s_to room_1,
    has light;

Object room_3 "room 3"
    with description [; 
        print "Una semplice stanza di esempio. Stanza 3. L'immagine è
               allineata a destra.^ In questa stanza puoi vedere un 
               esempio di utilizzo degli stili della SGW.^";
        print "Testo con lo stile ", (s_emph) "Emphasized", "^";
        print "Testo con lo stile ", (s_bold) "Bold", " (come in Inform)^"; 
        print "Testo con lo stile ", (s_pref) "Preformatted", "^";
        print "Testo con lo stile ", (s_fixed) "Fixed", " (come in Inform)^";
        print "Testo con lo stile ", (s_head) "Header", "^";
        print "Testo con lo stile ", (s_subhead) "Subheader", "^";
        print "Testo con lo stile ", (s_alert) "Alert", "^";
        print "Testo con lo stile ", (s_reverse) "Reverse", " (come in 
               Inform)^"; 
        print "Testo con lo stile ", (s_note) "Note", "^";
        print "Testo con lo stile ", (s_underline) "Underline/Italic", " 
               (come in Inform)^";
        print "Testo con lo stile ", (s_block) "BlockQuote", "^";
        print "Testo con lo stile ", (s_input) "Input", "^";
        viewImageRight(room3, 620);
    ],
    cant_go "Puoi muoverti solo a sud, verso la stanza 2.",
    s_to room_2,        
    has light;  

[ Initialise; 
    lookmode = 2;
    initializeSGW(240); ! Imposta la finestra grafica alta 240 pixel
    location = room_1; 
    playSound(chan1,rumble,1,VOLUME_HIGH);      
    playSound(chan2,heart,-1,VOLUME_NORMAL);
];

Include "ItalianG";

Come possiamo notare, è stata inclusa la libreria sgw (Include "sgw.h") prima di includere Parser. Nella funzione Initialise() ho inserito l’inizializzazione della libreria sgw (initializeSGW(240)) e impostato il lookmode a 2 (vedremo in seguito il motivo di questa operazione). In questo modo ho incluso e inizializzato la libreria SGW, possiamo riprodurre un suono e visualizzare un’immagine in qualsiasi punto del codice Inform.

Il file delle risorse

Ovviamente serve un altro file, che gestisce la “mappatura” delle risorse (i file multimediali JPF o AIFF).Creiamo dunque un nuovo file (sgw_test_it.res) sempre nella directory di “test”, con questo contenuto (questo file viene utilizzato per la creazione del file sgw_test_it.bli grazie all’utility bres.exe — in seguito vedremo come utilizzarlo a linea di comando):

CODE C:\test\sgw_test_it.ulx

PICTURE room1 C:\test\room1.jpg
PICTURE room2 C:\test\room2.jpg
PICTURE room3 C:\test\room3.jpg

SOUND rumble C:\test\rumble.aif
SOUND heart C:\test\heart.aif

In questo caso dovremo avere a disposizione tre immagini (di dimensioni 620×240 pixel) e due suoni in formato AIF (rumble.aif e heart.aif). Se non avete a disposizione tali file, non preoccupatevi. Potete scaricare il file di esempio della libreria SGW: include già un esempio da compilare con le risorse già pronte. Il link di partenza è sempre lo stesso: http://www.slade.altervista.org/?Inform:Simple_Glulx_Wrapper

In questo caso, supponiamo di avere nella directory C:\test\ i file JPG e AIF appena descritti.

Creazione del file bli e blc

Il primo passo consiste nell’esecuzione del tool bres.exe utilizzando come parametro il file di risorse sgw_test_it.res creato in precedenza. Supponendo che il percorso assoluto del tool bres.exe sia C:\Inform\Bin\tools\Blorb\, possiamo lanciare il seguente comando (in una finestra DOS):

C:\Inform\Bin\tools\Blorb\bres.exe C:\test\sgw_test_it

Se tutto è andato correttamente, dovreste vedere un messaggio simile a questo:

Il tool bres in azione

Vedrete che il tool bres.exe ha creato due nuovi file: uno con estensione BLI (sgw_test.bli) e il secondo con estensione BLC (sgw_test.blc). Provando ad aprire questi file generati vedrete che si tratta di file che associano una risorsa (immagine o suono) ad un codice univoco. Questo servirà poi per assemblare il tutto in un file con estensione BLB (eseguibile direttamente da un interprete Glulx).

Compilazione

Questo passo consiste nella compilazione del file principale (quello che abbiamo chiamato sgw_test_it.inf ). Supponendo che:

  • il compilatore inform abbia come percorso C:\Inform\Bin\compiler\
  • le librerie Inform (e INFIT) abbiano come percorso C:\Inform\Lib\Base
  • che la libreria sgw.h abbia come percorso C:\Inform\Lib\Contrib

il comando sarà:

C:\Inform\Bin\compiler\inform.exe +language_name=italian -G
+include_path=C:\test,C:\Inform\Lib\Base,C:\Inform\Lib\Contrib 
C:\test\sgw_test_it.inf C:\test\sgw_test_it.ulx

Il messaggio di compilazione dovrebbe essere simile a questo:

Compiliamo l'esempio

Andando a controllare la directory C:\test, vedrete che è stato creato un nuovo file sgw_test_it.ulx.

Creazione del file BLB

L’obiettivo è quello di creare un file BLB, che contiene tutte le risorse (grafiche e sonore) e l’avventura testuale stessa.

Per la creazione di tale file, si utilizza il tool blc.exe. Supponendo che tale file risieda nella directory C:\Inform\Bin\tools\Blorb\, il comando allora sarà:

C:\Inform\Bin\tools\Blorb\blc.exe C:\test\sgw_test_it.blc 
        C:\test\sgw_test_it.blb

Se non vi sono errori, avete appena creato il vostro file sgw_test_it.blb che utilizza la libreria SGW.H

Ecco l'esempio in esecuzione

Compilare l’esempio con JIF

È possibile scaricare la libreria SGW con un esempio (che è molto simile a quello appena effettuato), solo che tutti i file sono pronti per la compilazione.

Infatti, l’esempio contiene anche il file blb già compilato per vedere come funziona senza dover ricompilarlo. Ad ogni modo, è ovviamente possibile ricompilare il codice usando JIF. (È possibile ricompilarlo anche con altri tool, ma in questa pagina vedremo come compilarlo con JIF)

Sistemi win32

  1. Scaricare e scompattare l’esempio nella directory C:\sgw_it
  2. Aprire JIF (utilizzare se possibile la versione 2.0)
  3. Aprire un progetto: Aprire il file C:\sgw_it\sgw_test_it.jpf
  4. Aprire il file sgw_test_it.inf (sceglierlo dalla finestra di progetto, in basso a sinistra) con un doppio click sul nome del file
  5. Compilare il progetto
  6. Eseguire il progetto (l’icona del “razzo”)
  7. È possibile anche ricreare il file di risorse e il file blb da zero. In questo caso cancellare i file *.bli *.blc *.blb ed eseguire i menu:
    • Glulx -> Crea File di risorse
    • Glulx -> Compila il file inf
    • Glulx -> Crea Blb

*nix systems

  1. Scaricare e scompattare l’esempio in una directory XXX
  2. Aprire il file XXX\sgw_test_it.jpf con un editor di testo e modificare i path dei file, cambiandoli in e facendoli puntare alla directory XXX
  3. Chiudere il file XXX\sgw_test_it.jpf
  4. Aprire il file XXX\sgw_test_it.res con un editor di testo e modificare mettendo i path giusti (riferiti a XXX)
  5. Chiudere il file XXX\sgw_test_it.res
  6. Aprire JIF (utilizzare se possibile la versione 2.0)
  7. Aprire un progetto: Aprire il file XXX\sgw_test_it.jpf
  8. Aprire il file sgw_test_it.inf (sceglierlo dalla finestra di progetto, in basso a sinistra) con un doppio click sul nome del file
  9. Compilare il progetto
  10. Eseguire il progetto (l’icona del “razzo”)
  11. È possibile anche ricreare il file di risorse e il file blb da zero. In questo caso cancellare i file *.bli *.blc *.blb ed eseguire i menu:
    • Glulx -> Crea File di risorse
    • Glulx -> Compila il file inf
    • Glulx -> Crea Blb