Presentazione del linguaggio – 3

Funzioni

Una funzione ha la forma di un nome di funzione, seguito da zero o più argomenti tra parentesi, separati da virgole.

<funzione>(<arg1>,<arg2>,...)

Ci sono due tipi di funzioni

  • Prima di tutto, c’è un numero enorme di funzioni incorporate, per controllare tutti gli aspetti del gioco.
  • E poi, qualsiasi script che definisci nel tuo gioco può essere utilizzato come una funzione.

Note

  • Devi utilizzare le parentesi anche per le funzioni senza argomenti.
  • Alcune funzioni restituiscono un valore e possono essere utilizzate nelle espressioni.
  • Altre semplicemente eseguono comandi.

Non è possibile utilizzare una funzione come lato sinistro di un’assegnazione.
Per esempio, non puoi scrivere

instance_nearest(x, y, obj).speed = 0

Invece devi scrivere

(instance_nearest(x, y, obj)).speed = 0

Script

Quando realizzi uno script, vuoi accedere agli argomenti che gli sono stati passati (sia quando utilizzi l’azione script, sia quando chiami lo script come una funzione da un programma, oppure da un altro o dallo stesso script).
Gli argomenti sono memorizzati nelle variabili argument0argument1, …, argument15.
Quindi ci sono al massimo 16 argomenti.
Osserva che quando chiami lo script da un’azione puoi specificare solo i primi 5.
Puoi anche utilizzare la forma argument[0], …

Anche gli script possono restituire un valore e quindi possono essere utilizzati nelle espressioni.
Per quesco scopo utilizza l’istruzione return:

return <espressione>

L’esecuzione di uno script termina con l’esecuzione dell’istruzione return.

Esempio

Ecco la definizione di un piccolo script che calcola il quadrato dell’argomento:

{
    return (argument0*argument0);
}

Per chiamare uno script da una porzione di codice, si fa come con le chiamate di funzione.
Cioè, si scrive il nome dello script con i valori degli argomenti tra parentesi.

Istruzione with

Come detto prima, è possibile leggere e cambiare il valore delle variabili in altre istanze.
Ma in certi casi vuoi fare più cose con le altre istanze.

Per esempio, immagina di voler muovere tutte le palle in giù di 8 pixel.
Potresti pensare di ottenerlo con la porzione di codice seguente

ball.y = ball.y + 8;

Ma non è corretto.
Il lato destro dell’assegnazione prende il valore della coordinata y della prima palla e gli aggiunge 8.
Poi questo nuovo valore viene assegnato alla coordinata y di tutte le palle.
Quindi il risultato è che tutte le palle avranno la stessa coordinata y.
L’istruzione

ball.y += 8;

avrà esattamente lo stesso effetto perché essa è semplicemente un’abbreviazione della prima.
Allora come possiamo fare?
A questo scopo esiste l’istruzione with.
La sua forma generica è

with (<espressione>) <istruzione>

espressione indica una o più istanze.
Per questo puoi utilizzare un id, il nome di un oggetto (per indicare tutte le istanze dell’oggetto) oppure uno degli oggetti speciali (allselfothernoone).

istruzione viene eseguita per ciascuna delle istanze specificate come se fossero l’istanza attuale (self).
Allora, per muovere tutte le palle giù di 8 pixel, puoi scrivere.

with (ball) y += 8;

Se vuoi eseguire istruzioni multiple, racchiudile tra parentesi graffe.
Allora per esempio, per muovere tutte le palle a una posizione casuale, puoi utilizzare

with (ball)
{
  x = random(room_width);
  y = random(room_height);
}

Osserva che, all’interno delle istruzioni, l’istanza specificata diventa l’istanza self.

All’interno delle istruzioni l’istanza originale self diventa l’istanza other.
Quindi per esempio, per muovere tutte le palle alla posizione dell’istanza corrente, puoi scrivere

with (ball)
{
    x = other.x;
    y = other.y;
}

L’uso dell’istruzione with è estremamente potente.
Facciamo ancora degli esempi.

Per distruggere tutte le palle scrivi

with (ball) instance_destroy();

Se una bomba esplode e vuoi distruggere tutte le istanze vicine puoi scrivere

with (all)
{
    if (distance_to_object(other) < 50)
        instance_destroy();
}

Commenti

Puoi aggiungere commenti ai tuoi programmi.
Tutto quello che c’è su una linea dopo // non viene letto.
Puoi fare anche dei commenti multilinea inserendo il testo tra /* e */.
L’evidenziazione del codice potrebbe non funzionare correttamente… premi F12 per ricolorare il testo se c’è un errore.

Funzioni e variabili in GML

GML contiene un gran numero di funzioni e variabili.
Con queste puoi controllare qualsiasi aspetto del gioco.
Per tutte le azioni ci sono le funzioni corrispondenti quindi non hai alcuna necessità di usare le azioni se preferisci il codice.
Ma ci sono molte più funzioni e variabili che controllano aspetti del gioco che non possono essere affrontati soltanto con le azioni.
Quindi se vuoi realizzare giochi avanzati sei avvisato che devi leggere attentamente le prossime pagine per avere una panoramica di tutto ciò che è possibile.
Osserva inoltre che queste variabili e funzioni possono essere usate per dare valori alle azioni.
Quindi, anche se non intendi utilizzare codice o scrivere script, avrai comunque beneficio da queste informazioni.

Utilizzeremo le seguenti convenzioni

  • I nomi delle variabili marcati con * sono di sola lettura, cioè i loro valori non possono essere cambiati.
  • I nomi delle variabili seguiti da [0..n] sono array, l’intervallo dei possibili indici è dato.

Lascia un commento