Introduzione al GML (Game Maker language)

Transcript

Introduzione al GML (Game Maker language)
Introduzione al GML (Game Maker language):
Strutture e operatori logici.
In questa sezione introdurremo il linguaggio e i vari costrutti utilizzati in C, spiegandone l'utilizzo per il GML. Nel
corso di questa introduzione cercherò di fare in modo di utilizzare interpretazioni comuni al C e al GML.
Il GML è il linguaggio utilizzato dal Game Maker, il noto programma di Overmars, per facilitare un approccio
strutturato e disciplinato alla progettazione di un programma, in pratica un'interfaccia che funge da traduttore tra l'utente
e la macchina.
Perché utilizzare il GML quando Game Maker utilizza anche funzioni di Drag and Drop? Innanzitutto perché le
funzioni di Drag and Drop sono in qualche modo limitate, in secondo piano per ottimizzare la programmazione di
un'applicazione.
Inizializzazione variabili
Una variabile è una posizione della memoria in cui un valore può essere immagazzinato perché possa essere utilizzato
da un programma. Ovviamente per chi conosce già le funzioni del Drag and Drop del Game Maker, si tratta
semplicemente di inizializzare una variabile nell'evento Create di un object, ma in questo caso lo si fa semplicemente
scrivendolo con un'operazione di assegnamento. Ad esempio se dovessimo inizializzare la variabile var con un valore di
0, basterà semplicemente scrivere nell'evento Create:
var = 0;
A differenza del linguaggio C, nel GML il carattere ';' può essere in alcuni casi omesso, ma nel corso di questa sezione
vi sarà implemento lo stesso, poiché personalmente ritengo che sia di buon uso per una corretta visualizzazione del
codice.
Assegnamento e condizione
Il linguaggio C, come il linguaggio GML differiscono l'assegnamento dalla condizione.
Per l'assegnamento è previsto utilizzare un semplice '=', per dire ad esempio che in var deve essere assegnato il valore 0
(esempio precedente).
Per la condizione viene invece esplicitatala presenza doppia di un carattere, ad esempio il '==' per chiedere se una certa
variabile var contiene il valore 0:
var == 0;
Ovviamente la condizione non viene scritta in questo modo, per le tipologie di condizioni si chiariranno in seguito nelle
strutture. Questo esempio serve solo a distinguere l'operatore di assegnamento '=' dall'operatore di assegnamento '=='.
Segue una tabella con alcuni operatori di uguaglianza e relazionali standard.
Le strutture
Normalmente le istruzioni sono eseguite una dopo l'altra nell'ordine in cui sono state scritte. Le strutture consentono al
programmatore di specificare l'effettivo ordine di un'istruzione. Ci sono strutture per dare alternative ad alcune azioni, e
strutture per eseguire un'istruzione tante volte quanto necessarie, ecc. Una struttura risulterà più adatta in una
determinata situazione, o talvolta sarà simile ad un'altra struttura, tutto sta al programmatore scegliere quali tipi di
strutture utilizzare a seconda delle sue esigenze. Seguono le interpretazioni nonché le spiegazioni di alcuni tipi di
strutture.
Struttura di selezione if
Una struttura di selezione viene utilizzata per scegliere tra percorsi di azione alternativi. Per esempio si supponga di
dover esaminare se una variabile a ha valore 2, e in tal caso si voglia assegnare un valore 5 alla variabile b:
if (a == 2)
b = 5;
In questo modo nel caso a non sia uguale a 2, l'istruzione b = 5 verrà saltata per passare alle istruzioni successive.
Con la struttura di condizione cominciamo a vedere come si distinguono l'assegnamento dalla condizione:
•
if (a == 2): condizione. Richiede se a è uguale a 2
•
b = 5: assegnamento. Assegna il valore 5 a b
Nell'esempio appena considerato, dentro l'istruzione if (a == 2) c'è una sola istruzione b = 5. Se volessimo introdurre
più di un'istruzione in una struttura if basterà immettere le istruzioni desiderate tra i caratteri '{' e '}'. Esempio:
if (a == 2) {
b = 5;
c = c + b;
}
In questo esempio si chiede che, se a è uguale a 2, viene assegnato il valore 5 a b, e viene incrementato c di b (cioè al
valore di c viene sommato il valore di b ). Se fossero state omesse le parentesi graffe, l'istruzione c = c + b, sarebbe stata
comunque eseguita, invece in questo modo viene eseguita se e solo se a ha valore 2.
Si noti che scrivere c = c + b e scrivere c += b è la stessa cosa. Lo stesso vale per altri operatori. Di seguito la tabella
mostra i vari operatori aritmetici di assegnamento.
Struttura di selezione If/ Else
La struttura di selezione if esegue l'azione (o le azioni) indicata solo quando la condizione è vera; in caso contrario,
l'azione è ignorata. La struttura di selezione if/else consente al programmatore di specificare che, nel caso la condizione
sia vera, dovrà essere eseguita un'azione differente da quella che si dovrà eseguire qualora la condizione sia falsa. Ad
esempio:
if (a == 2) {
b = 5;
c = c + b;
}
else
b = 0;
In questo esempio si chiede che, se a è uguale a 2, viene assegnato il valore 5 a b, e viene incrementato c di b, altrimenti
se la condizione if (a == 2) è falsa viene assegnato il valore 0 a b.
Anche per else vale lo stesso discorso delle parentesi graffe per incorporare più di un'istruzione.
Struttura di iterazione while
Una struttura di iterazione consente al programmatore di specificare che un'azione dovrà essere ripetuta finché alcune
condizioni rimarranno vere. In pratica la struttura while presenta un ciclo che termina a seconda di una condizione.
Ad esempio:
while ( a <= 10) {
b += a;
a += 1;
}
In questo esempio il ciclo while esegue le istruzioni b+=a e a+=1, finché il valore di a è minore o uguale a 10. Si noti
che nel ciclo l'istruzione a+=1 serve ad incrementare la variabile a, di modo che quando a è uguale a 11, la condizione
del while risulterà falsa e si uscirà fuori dal ciclo.
Attenzione: Fornire sempre nel ciclo di una struttura while un'istruzione che faccia eventualmente diventare falsa la
condizione del while, altrimenti tale struttura di iterazione non avrà mai fine. Questo errore viene generalmente
chiamato “ciclo infinito”.
Struttura di iterazione for
La struttura di iterazione for gestisce automaticamente tutti i dettagli di una iterazione controllata da una variabile di
tipo contatore (che in questo caso viene chiamata anche variabile di controllo). Una variabile di tipo contatore si utilizza
nei cicli per fungere da controllo di un ciclo. Un esempio di utilizzo della struttura di iterazione for è la seguente:
for (i = 1; i <= 10; i += 1) {
b += i;
c = i * 2;
}
Prima di spiegare cosa fa l'esempio, andiamo ad esaminare i componenti della struttura for:
for (i = 1; i <= 10; i += 1)
Nella struttura abbiamo 3 elementi separati dai caratteri ';'. I tre elementi in ordine di successione sono:
•
Nome della variabile di controllo e sua inizializzazione:
- nel nostro caso abbiamo la variabile i a cui viene inizializzato il valore 1.
•
Condizione, valore finale della variabile di controllo:
- i <= 10. La nostra condizione è finché i è minore o uguale a 10.
•
Incremento della variabile di controllo:
- la variabile di controllo i viene incrementata di 1.
Compresi i componenti della struttura for, vengono complessivamente interpretati in questo modo:
Per i uguale a 1, finché i sarà minore o uguale a 10 e verrà incrementato per ogni fine ciclo di 1, esegui l'istruzione
(o le istruzioni) seguente.
Nel nostro caso le istruzioni seguenti, che sono quelle contenute nel corpo della struttura for (cioè comprese tra le
parentesi graffe), sono b += i e c = i * 2. In pratica queste due istruzioni verranno eseguite, poi verrà incrementato i di 1,
fintanto che il valore di i sarà minore o uguale a 10.
Struttura di selezione multipla switch
Abbiamo visto la struttura di selezione singola if e quella di selezione doppia if/else. A volta però potrebbe essere
richiesto che una determinata variabile od espressione venga confrontata distintamente con ognuno dei valori che essa
può assumere e che, a seconda del risultato del confronto, vengano eseguite istruzioni distinte. Il C e il GML forniscono
la struttura di selezione multipla switch (interruttore) per gestire una tale serie di decisioni.
Forniamo un esempio di questa struttura:
switch (var) {
case 1:
a += 1;
break;
case 2:
b += 1;
break;
case 3:
c += 1;
break;
case 4:
d += 1;
break;
}
La parola chiave switch è seguita dal nome della variabile var tra parentesi tonde. Questa è denominata espressione di
controllo. Il valore di questa espressione sarà confrontato con ognuna delle etichette chiamate “case”. Supponiamo che
la variabile var abbia assunto un valore casuale da 1 a 4 prima di entrare nello switch e che tale valore sia 3. Questo
valore sarà automaticamente confrontato con ogni case dello switch. Nel caso sia stata verificata una corrispondenza
(case 3:), saranno eseguite le istruzioni di quel case. Nel caso del valore 3, la variabile c sarà incrementata di 1 e la
struttura switch sarà abbandonata immediatamente con l'istruzione break.
L'istruzione break induce il controllo del programma a continuare con la prima istruzione dopo la struttura switch.
L'istruzione break è utilizzata poiché altrimenti verrebbero eseguiti insieme tutti i case di una struttura switch.
Come avrete ben capito con delle strutture if sequenziali avremmo ottenuto lo stesso risultato, ma la soluzione risulta
più ottimizzata in questo modo. Insomma, nel caso di molti if per una stessa variabile o espressione, è consigliato
utilizzare una struttura switch.
Gli operatori logici
Oltre agli operatori relazionali ( >, <, >=, <=) e quelli di uguaglianza ( == e != ), un'altra specie di operatori di cui tener
conto sono gli operatori logici. Fra gli operatori logici in GML riscontriamo:
•
•
•
Assegnamento: operatore logico AND &
Assegnamento: operatore logico OR |
Assegnamento: operatore logico XOR ^
Gli operatori logici vengono principalmente utilizzati per le condizioni, poiché un'operazione logica di assegnamento è
davvero rara da riscontrare. Di seguito sono riportate le tabelle delle combinazioni logiche dei tre operatori per capire
come funzionano. Premettiamo la legenda:
Nelle tabelle A e B sono le combinazioni logiche possibili, X è il risultato ottenuto. 1 rappresenta un valore diverso da
0 che è il valore nullo.
Gli operatori logici nelle condizioni
Fino ad ora abbiamo visto soltanto delle condizioni semplici, dettate da operatori relazionali o di uguaglianza. Ogni
decisione ha verificato precisamente una condizione. Se avessimo voluto controllare delle condizioni multiple in una
decisione, avremmo dovuto eseguire i suddetti controlli con delle strutture if o if/else nidificate (cioè due strutture, una
interna ad un'altra).
Il GML come il C differisce l'assegnamento dalla condizione anche per quello che riguardano gli operatori logici. In
questo modo avremo:
•
•
•
Condizione: operatore logico AND &&
Condizione: operatore logico OR ||
Condizione: operatore logico XOR ^^
Considereremo degli esempi per ognuno dei suddetti:
➔ Condizione AND: Verifica se entrambe le condizioni sono vere.
if (x == 5) && ( y == 7 )
Viene verificato solo se nello stesso momento i valori di x e y hanno i valori seguenti.
➔ Condizione OR: Verifica se almeno una delle condizioni è vera.
if (x == 5) || ( y == 7 )
Viene verificato se almeno uno dei valori tra x o y ha il valore seguente. La condizione viene verificata anche
se sono entrambi veri.
➔ Condizione XOR: Verifica solo se una delle condizioni è vera.
if (x == 5) ^^ ( y == 7 )
viene verificato solo se uno dei valori tra x o y ha il valore seguente. La condizione non è verificata se sono
entrambi veri
Tutorial by: AgamemnonStokE
info: [email protected]