Le enumerazioni (enum) sono strutture che permettono di definire un insieme di costanti intere con nomi significativi, rendendo il codice più leggibile. Invece di usare numeri (come 0, 1 o 2) per rappresentare stati o modalità, si possono assegnare etichette come, ad esempio FERMO, CORRE, SALTA, rendendo il codice più pulito, meno incline a errori e più semplice da documentare. Le enumerazioni sono particolarmente utili per gestire stati di un personaggio, tipi di oggetti, livelli di difficoltà o qualsiasi situazione in cui un valore possa assumere solo un numero limitato di opzioni.
Definire una enumerazione
Le enumerazioni sono strutture dati che contengono un numero finito di costanti; per definire una enumerazione si usa la seguente sintassi:
All'interno delle parentesi graffe si inseriscono i valori che descrivono l'enumerazione, per convenzione scritti in MAIUSCOLO. Per definire i valori di una enumerazione si possono usare più righe.
In GDScript, le enumerazioni si dichiarano a livello di script (visibilità di classe), preferibilmente (ma non è obbligatorio) all'inizio del file dopo la parola chiave extends ed il nome della classe, prima delle funzioni dello script. Questo permette a tutte le funzioni di accedervi e, se lo script ha un nome di classe, rende l'enum accessibile anche da altri file tramite la sintassi NomeClasse.NomeEnum. Non è possibile dichiarare una enum all'interno di una funzione (l'editor restituirà un errore di sintassi). Se si ha bisogno di un insieme di valori limitato solo a una funzione, la soluzione standard è usare un dizionario locale o delle semplici variabili.
Una enumerazione agisce essenzialmente come un tipo di dato, il che significa che si può assegnare ad una variabile il valore di una delle opzioni listate nell'enumerazione. I valori listati nelle opzioni dell'enumerazione sono in realtà valori interi a partire da 0: nell'esempio precedente è come se PUGNALE fosse il valore 0, SPADA il valore 1 e ASCIA il valore 2. Per assegnare il valore ad una variabile di tipo enumerazione, si usa la sintassi
var nomeVariabile: TipoEnum = TipoEnum.valoreEnum
OUTPUT dell'esecuzione (estendi l'area di testo se necessario):
Se non si vogliono assegnare i valori predefiniti 0, 1, 2 ecc. alle opzioni dell'enumerazione, si possono assegnare valori differenti al memento della definizione, tutti o in parte. I valori eventualmente non assegnati assumono un valore superiore di una unità rispetto a quello che lo precede: ad esempio, se nel caso del codice precedente si definisce:
l'output dell'esecuzione diventerebbe:
a PUGNALE è assegnato il valore 5, a SPADA non è stato assegnato alcun valore, di conseguenza assume un valore di una unità superiore rispetto a quello che lo precede (PUGNALE), per cui SPADA ha valore 6.
Le funzioni size(), keys() e values()
Data una enumerazione, ci sono tre metodi (funzioni) che permettono di ricavarne un profilo completo:
- size(), restituisce il numero di elementi (cioè la dimensione) dell'enumerazione;
- keys(), restituisce un array (pensiamolo come una lista) che contiene i nomi logici, detti chiavi, dei valori dell'enumerazione;
- values(), restituisce un array dei valori dell'enumerazione.
Per usare tali funzioni si ricorre alla seguente sintassi:
ESEMPIO: definiamo gli stati di un giocatore e recuperiamone le caratteristiche da codice.
OUTPUT dell'esecuzione (estendi l'area di testo se necessario):
In alternativa, per evitare di costruire array di valori (che occupano memoria) e recuperare chiavi e valori dell'enumerazione, si può ricorrere ad un ciclo for:
ESEMPIO 1: recuperiamo chiavi e valori con due cicli for e le funzioni keys() e values().
OUTPUT dell'esecuzione (estendi l'area di testo se necessario):
ESEMPIO 2: recuperiamo chiavi e valori un ciclo for e la funzione size().
NOTA: quando si scrive il codice tra parentesi tonde, quadre o graffe, Godot "capisce" automaticamente che la riga di codice continua "a capo" e non è ancora termianta fin quando trova la parentesi di chiusura.
OUTPUT dell'esecuzione (estendi l'area di testo se necessario):
Evitare gli errori logici con le enumerazioni
In GDScript, le enumerazioni sono mappate sui numeri interi con un nome leggibile. Dal punto di vista tecnico è possibile avere una variabile di tipo enum con l'assegnazione di un valore non contemplato nelle ozpioni dell'enum; non si riceve un errore (né un crash immediato né un errore di compilazione), perché tecnicamente un int è compatibile con il tipo dell'enumerazione. Tuttavia questo è un errore logico che va prevenuto. Ad esempio, se si assegna un'arma con un numero non previsto, durante il gioco il valore associato non è gestito, il giocatore potrebbe attaccare con un'arma "illegale" (nel senso che nel codice non è gestita) ed il suo attacco con quell'arma non provoca danno al nemico.
ESEMPIO: gestiamo un valore illegale.
OUTPUT dell'esecuzione (estendi l'area di testo se necessario):
| Precedente | Indice | Successivo |