mercoledì 11 febbraio 2026

GDScript - Enumerazioni (enum)

Godot - GDScriptLe 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:

enum <nome_enum> {VAL_1, VAL_2, ..., VAL_n}

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.

enum

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

enum e int

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:

enum Arma {PUGNALE=5, SPADA, ASCIA=-2}

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:

TipoEnumerazione.size()
TipoEnumerazione.keys()
TipoEnumerazione.values()

ESEMPIO: definiamo gli stati di un giocatore e recuperiamone le caratteristiche da codice.

funzioni size(), keys(), values()

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().

chiavi e valori con for

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.

Istruzione si più righe

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.

Valori illegali per una enum

OUTPUT dell'esecuzione (estendi l'area di testo se necessario):


Precedente Indice Successivo