Inform e Glulx/Inform e ancora Inform/I colori

Indice del libro

I colori

modifica

Per quanto riguarda la gestione dei colori, l’istruzione SetColour per la selezione del colore del testo e dello sfondo richiede, nel suo utilizzo, certe attenzioni particolari. Il primo "cambio di colore" deve avvenire all’interno della funzione Initialise, anche se in effetti questa regola non è esclusiva poiché quest’istruzione può essere usata in un punto qualsiasi del listato. Tuttavia, per essere completamente sicuri che avvenga il cambio di colore almeno una volta, è meglio seguire la regola sopra citata:

[ Initialise;
        print "Vuoi supportare i colori (s/n)? ";
        if (yesorno()) clr_on = 1; 
        else clr_on = 0;
        
SetColour(9,2); ClearScreen(); TitlePage(); location = Forest; . . .

Affinché l’istruzione SetColour abbia effetto, occorre impostare a 1 la variabile di libreria clr_on. Dal momento però, che non è detto che tutti gli interpreti supportino correttamente i colori (non bisogna mai dimenticare che Inform è linguaggio multipiattaforma - palmari compresi), e meglio far sì che Inform chieda prima al giocatore se desidera o no il loro supporto all’inizio del gioco; se quest’ultimo risponde alla domanda premendo i tasti s e invio, i colori vengono attivati (la variabile di libreria clr_on viene cioè posta uguale a 1), altrimenti (se il giocatore preme cioè i tasti n e invio) rimangono attivi quelli di default (la variabile di libreria clr_on vale 0 e vengono di conseguenza ignorate da Inform tutte le istruzioni relative ad essi)[1]. In Inform, inoltre, a ogni colore corrispondono un numero e una costante, come mostrato nella seguente tabella:

  DEFAULT     1     CLR_DEFAULT  
  NERO     2     CLR_BLACK  
  ROSSO     3     CLR_RED  
  VERDE     4     CLR_GREEN  
  GIALLO     5     CLR_YELLOW  
  BLU     6     CLR_BLUE  
  MAGENTA     7     CLR_MAGENTA  
  CIANO     8     CLR_CYAN  
  BIANCO     9     CLR_WHITE  
  VIOLA     7     CLR_PURPLE  
  AZZURRO     8     CLR_AZURE  

I due valori assegnati all’istruzione SetColour rappresentano rispettivamente il colore del testo (il 9 o CLR_WHITE) e dello sfondo (il 2 o CLR_BLACK); non è difficile, a questo punto, capire che il numero nove rappresenta il colore bianco e il numero due il colore nero. Volendo poi cambiare il colore di una o più parole, ecco cosa si deve fare:

[ TitlePage;
        ClearScreen(); print "^^^^^^^^^^^^^";
        style bold; font off; 
        SetColour(3,2); Centre("RUINS");
        style underline; print "^^"; 
        SetColour(5,2); Centre("[Premi SPAZIO per iniziare.]");
        SetColour(9,2); print "^^";
        font on;
        box "Ma l'alligatore non stava scavando il fondo della buca"
            "Che avrebbe dovuto essere la sua tomba"
            "Piuttosto era lui che stava scavando la propria buca"
            "Come riparo per se stesso"
            ""
            "-- dal Popol Vuh";
        KeyCharPrimitive();
        ClearScreen();
        ];

ottenendo così il seguente risultato:

 

Per cambiare il colore del testo della descrizione di un oggetto occorre modificare la proprietà description nel seguente modo:

Object  Forest "Il Grande Altopiano"
  with  description [;
            SetColour(4,2,2); print "I tuoi appunti menzionano qualcosa 
               circa questa bassa ";
            SetColour(5,2,2); print "scarpata di calcare, ma la foresta 
              pluviale ne ha ";
            SetColour(9,2,2); print "rivendicato il possesso. Cupi ulivi 
              Crescono ovunque, e una pioggia appena smessa riempie 
              l'aria con una calda nebbia bagnata.^
              La ~Struttura 10~ @`e un cumulo di materiali da 
              costruzione, che una volta avrebbero potuto costituire una 
              piramide sepolcrale, ma della quale ora nulla rimane,
              eccetto alcuni gradini scolpiti nella nuda roccia che 
              portano gi@`u, nell'oscurit@`a.";
             ],
        d_to steps,
        in_to steps,
           .
           .
           .

Il risultato potete vederlo nella figura che segue:

 

Partendo dal presupposto che i colori di default siano il bianco per il testo e il nero per lo sfondo, all’interno della proprietà description dell’oggetto interessato si richiama una o più volte l’istruzione SetColour mantenendo il colore dello sfondo di default (2) e cambiando invece il colore del testo (in questo caso prima 4 e poi 5), ripristinando poi il tutto al bianco e al nero (evitando così che il testo che segue resti in giallo). Quando si lavora con i colori, occorre quindi definire sempre quelli di default all’interno della funzione Initialise. Il terzo numero (il 2), presente in entrambe le istruzioni, dice a Inform che il cambio di colore deve riguardare solo la finestra principale. Usando invece il numero 1, il cambio di colore avviene solo nella status line; se invece non si mette nulla, il cambio di colore avviene per entrambe (la status line e la finestra principale).

Un altro utilizzo abbastanza comune dei colori nelle avventure testuali, è quello di cambiare il colore dello sfondo e del testo al cambio di locazione o di sezione. Ecco allora una possibile implementazione:

Object  Square_Chamber "La Sala Quadrata"
  with  name...
        description...
        s_to [;
               Changecolor(Corridor);
               return Corridor;
        ],
        .
        .
        .

Se il giocatore si trova nella Sala Quadrata e si dirige verso sud, viene effettuata la chiamata alla funzione Changecolor che cambia il colore del testo da bianco a giallo e il colore dello sfondo da nero a blu:

.
.
.
[ DeathMessage...

[Changecolor object; if (object == Corridor) SetColour(CLR_YELLOW,CLR_BLUE); if (object == Square_Chamber) SetColour(CLR_WHITE,CLR_BLACK); if (clr_on == 1) ClearScreen(); ];

Quando il giocatore torna indietro verso la Sala Quadrata, viene effettuata una seconda chiamata alla funzione Changecolor che ripristina i colori di default:

Object  Corridor "Corridoio in pendenza"
  with  description
            "Un corridoio basso e squadrato va da nord verso sud, 
             inclinandosi verso la fine.",
        n_to [;
               Changecolor(Square_Chamber);
               return Square_Chamber;
        ],
        s_to StoneDoor;

L’istruzione ClearScreen, si rende necessaria nella funzione Changecolor perché viene cambiato anche il colore dello sfondo (a condizione, ovviamente, che i colori siano attivi). Se dobbiamo invece cambiare solo il colore del testo, occorre allora riscrivere la funzione Changecolor nel seguente modo:

[Changecolor object;
        if (object == Corridor) SetColour(CLR_YELLOW,CLR_BLACK,2);
        if (object == Square_Chamber) SetColour(CLR_WHITE,CLR_BLACK,2);
];

Eliminando l’istruzione ClearScreen e mantenendo il nero come colore di sfondo, il problema è risolto; provare per credere...[2]

  1. L’istruzione yesorno risponde solo alle lettere s (o si) e n (o no). Se si vogliono usare anche le altre, occorre rifarsi all’istruzione ReadChar, da me creata e descritta nel capitolo 3.
  2. Cliccate qui per scaricare i listati di questi esercizi (i file 5.04_1.inf, 5.04_2.inf, 5.04_3.inf e 5.04_4.inf).