Game Maker Language: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
m Little edits
 
(41 versioni intermedie di 22 utenti non mostrate)
Riga 1:
{{E|Tanti dettagli da guida del programmatore, nessuna fonte terza che evidenzi rilevanza al di fuori del software principale. Basta probabilmente riportare il succo alla voce [[Game Maker]]. Su en.wiki è già un redirect e le altre lingue non sono messe meglio|informatica|luglio 2023}}
{{tmp|linguaggio di programmazione}}
{{SF|linguaggi di programmazione|settembre 2017}}
{{W|informatica|aprile 2018}}
'''Game Maker Language''' ('''GML''') è un [[linguaggio di scripting]] sviluppato per la creazione di videogiochi con [[Game Maker]]. Il GML possiede una sintassi che ricorda molto quella del [[C (linguaggio)|C]] o del [[JavaScript]] ed per questa sua caratteristica esso viene insegnato in numerose scuole come "trampolino" per lo studio di altri linguaggi.
{{Linguaggio di programmazione
|immagine =
|didascalia =
|versione =
|utilizzo =
|paradigmi =
|tipizzazione =
|specifiche =
|estensione =
|influenzato_da =
|ha_influenzato =
|implementazione_riferimento =
|sistema_operativo =
|lingua =
|licenza =
|sito_web =
}}
 
'''Game Maker Language''' ('''GML''') è un [[linguaggio di scripting]] sviluppato per la creazione di videogiochi con [[Game Maker]]<ref>{{cita web |url=https://docs.yoyogames.com/index.html?page=source%2Fdadiospice%2F002_reference%2Findex.html |titolo=Game Maker: Studio ver. 1.4 |lingua=en |accesso=29 novembre 2017}}</ref>. Il GML possiede una sintassi che ricorda molto quella del [[C (linguaggio)|C]] o del [[JavaScript]].
È stato creato da [[Mark Overmars]] inizialmente per aiutare a completare il sistema di [[drag and drop]] del suo programma. Da quando [[YoYoGames]] ha acquistato i diritti del programma, il GML è considerato l'unico mezzo di programmazione in [[Game Maker]].
 
È stato creato da [[Mark Overmars]] inizialmente per aiutare a completare il sistema di [[drag and drop]] del suo programma. Da quando [[YoYo Games]] ha acquistato i diritti sul software, il GML è divenuto il [[linguaggio di programmazione]] utilizzabile nello sviluppo di videogiochi con [[Game Maker]]. L'implementazione di questo linguaggio nell'IDE ha reso ai programmatori molta più flessibilità e controllo rispetto alla programmazione tramite l'interfaccia Drag'n'Drop disponibile fino ad allora.
 
I modi in cui è possibile interagire con gli ''oggetti'' nel gioco tramite GML possono essere riassunti come segue:
* Attraverso script per la creazione di funzioni personalizzate;
* Interagendo con gli eventi è possibile controllare il comportamento di tali oggetti;
* Nella creazione di una ''stanza'' associandovi dello specifico codice;
* Nelle singole istanze di ogni oggetto;
 
==Oggetti==
Se si desidera usare il GML è importante capire come funzionano gli oggetti in questo linguaggio.
* Come prima cosa ilIl programmatore:
# crea degli oggetti (vuoti)
*# eassocia gliagli associaoggetti, se vuole, delledegli [[sprite (informatica)|sprite]] (ovvero degli elementi grafici)
* poi li# "riempie" gli oggetti inserendo una programmazione (basata sugli eventi)
 
Esistono 3tre tipi di programmazione: 1)
# ad icone 2)
# a codice 3)
# ibrido (entrambi i precedenti).
 
- A questo punto, medianteMediante un [[editor grafico]] si inseriscono gli oggetti (ovvero si creano quelle che vengono chiamate "[[istanza di oggetto]]") in un'area denominata stanza.
 
Da notare che molteplici istanze dello stesso oggetto (se l'oggetto è stato programmato in tal senso) agiranno l'una rispetto all'altra in maniera autonoma. Gli oggetti che non avranno istanze (ovvero che non sono inseriti nella stanza) non funzioneranno (la loro programmazione verrà ignorata). le istanze, oltre che mediante editor grafico, possono anche essere create dinamicamente (in qualsiasi momento) da un'altra istanza (non necessariamente dello stesso oggetto) o dal creation code della room stessa durante l'esecuzione del [[software]].
 
==Variabili==
La divisione per tipi di dato è piuttosto semplice, esistono solo 2 tipi di [[Variabile (informatica)|variabili]]: numeriche e stringhe (le variabili booleane sono considerate come di tipo numerico: tecnicamente non formano un tipo di dati a parte).
 
esiste anche una divisione (indifferentemente dal tipo di dati contenuto) in variabili globali, di istanza e temporanee
 
Esiste anche una divisione (indifferentemente dal tipo di dati contenuto) in variabili globali, di istanza e temporanee
* '''globali''': a ogni nome univoco ne corrisponde una sola, che è accessibile e modificabile da un codice che può essere posto indistintamente in qualsiasi [[script]] o qualunque evento di qualunque oggetto
 
* '''di istanza''': a ogni nome univoco ne possono corrispondere molteplici: una per oggetto (o più precisamente una per istanza di oggetto)
 
* '''temporanee''': a ogni nome univoco ne possono corrispondere molteplici: una per script o piece of code (ogni evento può avere uno o più "piece of code") dove è posizionata. Questo tipo di variabili è da considerarsi completamente privato (a differenza di delle variabili di istanza), ovvero uno script o piece of code che generano una variabile temporanea hanno accesso unico a quella variabile (la quale comunque verrà rimossa alla fine del "piece of code" in cui era dichiarata).
 
In game maker language esistono anche variabili dette built-in (sono più di 150). A differenza delle normali variabili, in cui nome èe logica di funzionamento vengono decisi dal programmatore, queste sono variabili prestabilite dal creatore del linguaggio: è necessario leggereleggerne l'utilizzolo unaspecifico per unautilizzo sul manuale. Alcune di esse (marchiateevidenziate nel manuale con un asterisco) sono dette "variabili built-in di sola lettura", da non confondere con le costanti.
 
===Dichiarazione e assegnazione di dato a una variabile===
InCome questoaccade linguaggioin molti linguaggi di scripting, anche in realtà,GML nonè esisteprevista una dichiarazione nelimplicita qualedelle sivariabili, definiscononon qualesarà tipiquindi dinecessario datoindicare sitipo andràe dimensione della variabile a metterelivello nelledi variabili,definizione semplicementedella stessa, quando si vuoleha crearela necessità di un certo tipo di variabile si effettuadovrà effettuarne direttamente l'inizializzazione. Fanno eccezione le variabili dichiarateglobali e locali, identificate rispettivamente con le parole chiave ''globalvar'' e ''var'', lela quali hanno quindi unaloro dichiarazione (marappresenta anchequindi insolo questol'intenzione casodi nonassegnare verràuno definito''scope'' qualealla tipovariabile disenza daticomunque sidover verràindicarne ail inseriretipo ine la esse)dimensione.
 
L' [[assegnazione]] di un dato avviene nel seguente modo:
<sourcesyntaxhighlight lang=gml"c">
nome_variabile = dato_che_vuoi;
</syntaxhighlight>
</source>
È chiaro che prima di accedere a una variabile bisogna almeno una volta fare un' assegnazione (inche questone casoinizializzi dettail inizializzazione, intesa come inserimento dei valori iniziali)valore.
 
Da notare che "dato_che_vuoi" oltre che essere un semplice dato, può anche essere espressione che coinvolge sia variabili, sia valori (stringhe, numeri o booleani), sia function o script, il tutto combinato insieme mediante operatori (matematici, di stringa e booleani) a seconda di ciò che si vuole fare. '''NOTA''': l'ordine di computazione della espressione e da sinistra a destra, per cambiare tale ordine si possono usare delle [[parentesi tonde]].
 
Da notare che "dato_che_vuoi" oltre che essere un semplice dato, può anche essere espressione che coinvolge sia variabili, sia valori (stringhe, numeri o booleni), sia function o script, il tutto combinato insieme mediante operatori (matematici, di stringa e booleani) a seconda di ciò che si vuole fare. NB: l' ordine di computazione della espressione e da sinistra a destra, per cambiare tale ordine si possono usare delle [[parentesi tonde]].
====Assegnazione relativa====
Una variabile può anche fare un calcolo su se stessa, (a patto di essere già stata inizializzata). Un semplice esempio eè dato dal contare: quando un software fa comparire a schermo un conto alla rovescia non fa altro che eseguire (ciclicamente) questo comando:
<sourcesyntaxhighlight lang=gml"c">
tempo = tempo - 1
</syntaxhighlight>
</source>
oppureOppure, in forma abbreviata:
<sourcesyntaxhighlight lang=gml"c">
tempo -= 1
</syntaxhighlight>
</source>
 
====Assegnazione di un dato alle variabili built-in====
Le assegnazioni alle built-in avvengono come qualunque assegnazione, l'unica differenza (per quanto riguarda le assegnazioni) eè che esse hanno già un' inizializzazione.
 
==Eventi==
ilIl GML è un linguaggio basato sugli eventi: ogni gruppo di istruzioni va posizionato in un evento (la scelta dell'evento dipende da "quando" si vuole che un determinato blocco entri in azione), cioè, in pratica, il programmatore deve specificare quando, ogni sequenza di istruzioni, deve entrare in funzione.
 
Ecco alcuni eventi a disposizione del programmatore:
 
* '''create_ev'''
 
ilIl codice in esso contenuto viene eseguito all'avvio del programma.
 
* '''step_ev'''
 
ilIl codice in esso contenuto viene eseguito continuamente, generalmente 30 volte al secondo.
NB'''NOTA''': tale valore può variare a seconda di come il programmatore ha regolato in gioco e a seconda del rapporto velocità computer/pesantezza del programma.
 
* '''mouse_ev'''
 
ilIl codice viene eseguito da una istanza di oggetto (*) quando si clicca su esso.
NB'''NOTA''': * i codici, tranne quello nel creation_event della room, vengono tutti eseguiti dalle istanze di oggetti.
 
* '''mouse_global_ev'''
 
questo evento si scatena quando il giocatore clicca su un' istanza che contiene tale evento
 
* '''step_ev'''
 
questoQuesto evento si scatena (generalmente)quando 30il voltegiocatore alclicca secondo,su ovveroun'istanza continuamenteche contiene tale evento.
 
* '''draw_ev'''
 
questoQuesto evento si scatena (generalmente) 30 volte al secondo, esso, come dice il nome, è strettamente legato alla gestione grafica.
 
* '''any_key_press_ev'''
 
siSi scatena quando viene è abbassato un tasto qualunque (per scatenarlo continuamente basta continuare a tenere il tasto abbassato).
 
* '''any_key_pressed_ev'''
 
siSi scatena quando viene premuto un tasto qualunque (per scatenarlo più volte bisogna premere e rilasciare il tasto).
 
NB'''NOTA''': in realtà alcuni eventi (per esempio: any_key_press_ev, any_key_pressed_ev) sono emulabili da un if inserito in uno step_ev. Questo mette in evidenza come in GML gli eventi, in pratica, possono essere paragonati a degli IF eseguiti ciclicamente (tutti in un unico ciclo).
 
unUn esempio di quanto detto sopra:
 
<sourcesyntaxhighlight lang=gml"c">
any_key_pressed_ev
{
Riga 101 ⟶ 126:
azione3
}
</syntaxhighlight>
</source>
e equivalente a
<sourcesyntaxhighlight lang=gml"c">
step_ev
if (keyboard_check_pressed(any_key))
Riga 111 ⟶ 136:
azione3
}
</syntaxhighlight>
</source>
 
==Function==
leLe [[Funzione (informatica)|function]] hanno questa sintassi:
<sourcesyntaxhighlight lang=gml"c">
data_out = funct_name(data_in1, data_in2, data_in3 ecc.)
</syntaxhighlight>
</source>
naturalmenteNaturalmente "data_out =" ha senso solo in caso la function restituisca un valore significativo, tuttavia la sintassi indicata qui sopra tecnicamente non viene segnalata come errore anche in caso non ci siano valori da restituire.
Allo stesso modo se una function restituisce un dato significativo la parte "data_out =", sebbene generalmente consigliata, non è obbligatoria.
 
inIn GML Lele ''function'' definite (e programmate) dall' utente vengono chiamate anche "script".
 
==If e blocchi di istruzioni==
Sintassi:
sinstassi:
<sourcesyntaxhighlight lang=gml"c">
if (condizione)
{
Riga 137 ⟶ 163:
azione3
}
</syntaxhighlight>
</source>
 
I Blocchiblocchi di istruzioni sono racchiusi tra parentesi graffe Se la condizione che viene dopo la keyword "if" è verificata (con risultato true, quindi) verrà eseguito il primo blocco altrimenti il secondo. La condizione può essere un'[[espressione booleana]] più o meno complessa in base a ciò che si vuole ottenere. (Le variabili e espressioni booleane fanno parte della [[algebra di Boole]] che trova utilizzo in elettronica e informatica.)
 
Esempio:
esempio:
<sourcesyntaxhighlight lang=gml"c">if (num > 3)
if (num > 3)
{
show_message("il numero è maggiore di 3")
Riga 150 ⟶ 177:
show_message("il numero è uguale o minore a 3")
}
</syntaxhighlight>
</source>
Nel caso qui sopra l'espressione e data un test con il ">" ("se la variabile num ha un valore maggiore di 3 esegui il primo blocco di istruzioni altrimenti esegui il secondo"), invece in altri casi il test può essere generato da una function booleana (ovvero che restituisce valori booleani).
 
Esempio:
esempio:
<sourcesyntaxhighlight lang=gml"c">
if (instance_exists(oggetto_stella))
{
show_message("esiste almeno un oggetto stella")
Riga 162 ⟶ 190:
show_message("nessun oggetto stella presente")
}
</syntaxhighlight>
</source>Se si desidera creare espressioni booleane complesse si può combinare più espressioni booleane semplici tra di loro usando gli operatori booleani.
Se si desidera creare espressioni booleane complesse si può combinare più espressioni booleane semplici tra di loro usando gli operatori booleani.
===operatori booleani===
 
'''nelle espressioni booleane è possibile usare degli operatori booleani.'''
===Operatori booleani===
Nelle espressioni booleane è possibile usare degli operatori booleani.
 
Tutte le espressioni booleane restuituiscono valori booleani (true o false, 1 o 0, si o no, vero o falso) ma, in alcuni casi, possono avere in ingresso anche dati di altro tipo.
:* '''operatori;Operatori che prendono in ingresso valori numerici o stringhe'''
*'''==''' (simbolo alternativo: "=") - Doppio [[uguale]]. Questo operatore permette di confrontare 2 dati (numeri o stringhe) e restituisce un valore booleano. Più precisamente restituisce true in caso di uguaglianza tra i 2 dati, altrimenti false.
*''' != ''' (simbolo alternativo: "<>") - [[Diverso]]. Questo operatore permette di confrontare 2 dati (numeri o stringhe). Più precisamente restituisce true in caso di disuguaglianza tra i 2 dati, altrimenti false.
 
;Operatori che prendono in ingresso valori numerici
'''==''' (simbolo alternativo: "=")
*'''>''' - maggiore. Restituisce true in caso il valore a sinistra sia più alto di quello di destra.
*'''<''' - minore. Restituisce true in caso di valore di sinistra sia più piccolo di quello di destra.
 
;Operatori che prendono in ingresso valori booleani<ref>l'ordine in cui vengono computate le espressioni booleane complesse è da sinistra a destra, a meno che un non si generi un ordine diverso usando delle [[parentesi tonde]].</ref>
doppio [[uguale]]. Questo operatore permette di confrontare 2 dati (numeri o stringhe) e restituisce un valore booleano. Più precisamente restituisce true in caso di uguaglianza tra i 2 dati, altrimenti false.
*'''&&''' - [[Algebra di Boole#AND|and]]. Se 2 o più espressioni booleane sono unite da dei &&, il risultato dell'espressione finale sarà true solo se il risultato di tutte le sottoespressioni è true.
 
*'''||''' - [[Algebra di Boole#OR|or]]. Se 2 o più espressioni booleane sono unite da dei ||, il risultato dell'espressione finale sarà true solo se il risultato di almeno una delle sottoespressioni è true.
''' != ''' (simbolo alternativo: "<>")
*'''^^''' - [[Algebra di Boole#XOR|xor]]. Se 2 o più espressioni che booleane sono unite da dei ^^, il risultato dell'espressione finale sarà true solo se il risultato di una sola delle sottoespressioni è true.
 
*''' ! ''' - [[Algebra di Boole#NOT|not]]. Inverte un'espressione passandola a false (se era true) oppure a true (se era false). Notare che due not consecutivi si annullano, ovvero le espressioni "!(!(true))" è "(true)" sono equivalenti.
[[diverso]]. Questo operatore permette di confrontare 2 dati (numeri o stringhe) . Più precisamente restituisce true in caso di disugualianza tra i 2 dati, altrimenti false.
 
:* '''operatori che prendono in ingresso valori numerici'''
 
'''>'''
 
maggiore. Restituisce true in caso il valore a sinistra sia più alto di quello di destra.
 
'''<'''
 
minore. Restituisce true in caso di valore di sinistra sia più piccolo di quello di destra.
 
:* '''operatori che prendono in ingresso valori booleani
'''&&'''
 
[[Algebra_di_Boole#AND|and]]. Se 2 o più espressioni booleane sono unite da dei &&, il risultato dell'espressione finale sarà true solo se il risultato di tutte le sottoespressioni è true.
 
'''||'''
 
[[Algebra_di_Boole#OR|or]]. Se 2 o più espressioni booleane sono unite da dei ||, il risultato dell' espressione finale sarà true solo se il risultato di almeno una delle sottoespressioni è true.
 
'''^^'''
 
[[Algebra_di_Boole#XOR|xor]]. Se 2 o più espressioni che booleane sono unite da dei ^^, il risultato dell' espressione finale sarà true solo se il risultato di una sola delle sottoespressioni è true.
 
''' ! '''
 
[[Algebra_di_Boole#NOT|not]]. Inverte un'espressione passandola a false (se era true) oppure a true (se era false). Notare che due not consecutivi si annullano, ovvero le espressioni "!(!(true))" è "(true)" sono equivalenti.
 
'''note:'''
 
* Da notare che l'ordine in cui vengono computate le espressioni booleane complesse è da sinistra a destra, a meno che un non si generi un ordine diverso usando delle [[parentesi tonde]].
 
* esempio di espressione incoerente
Non ha senso fare un test tra valore un prettamente booleano (come quello risultante da "instance_exists(obj_stella)") con un valore di altro tipo (numerico diverso da 0 e 1 o stringa) facendo un esempio:
<source lang="gml">
dat_out = (instance_exists(obj_stella) == 3)
</source>
Analizzando la linea: quella funzione (per definizione) può restituire solo due valori (0 e 1), e quindi non ha senso chiedersi se tale valore sia uguale a 3 o no. (NB: in realtà in GML non è errore di sintassi in senso stretto).
 
==Eliminare ridondanza non necessaria==
laLa ridondanza di parti non necessarie può causare avere un software ingombrante, caotico e difficile da mantenere. Per evitare ciò esistonoè glipossibile avvalersi di '''script''' e ladella '''parentela tra oggetti'''.
===script===
definizione secondo il manuale di game maker:
 
"Scripts are the way in which GameMaker: Studio permits you to design your own functions."
 
(trad: Gli script sono il modo nel quale GameMaker:studio ti permette di ideare le tue personali function)
 
lo script è un normale "piece of code" in GML, con la differenza che si avvarrà delle keyword "argument0", "argument1", "argument2" ecc. per accedere ai vari
argomenti che sono stati inseriti nella chiamata come [[input]]. Invece per generare la restituzione di un valore di [[output]] userà la parola chiave "return" (essa provocherà anche la terminazione dello script eseguito).
 
Gli argument possono essere accessibili anche sottoforma di [[array]] monodimensionale ed esiste anche un modo per determinare quanti argomenti sono stati specificati: si potrà creare una function a numero di argomenti variabile.
 
È da notare che i valori restituiti non possono essere più di 1 per chiamata.
===parentela tra oggetti===
in GML la '''parentela tra oggetti''' è un modo per ridurre la ridondanza dei codici di un progetto, al fine di ottenere un software meno ingombrante, meno caotico e più mantenibile.
 
Per ogni oggetto si può definire un oggetto parent (=padre). NB: non è detto che a oggetto diverso corrisponda oggetto parent diverso.
 
Quando si definisce un parent succedono alcune cose:
 
- l'oggetto figlio eredita il codice del parent (a meno che esista un evento di stesso tipo nell' oggetto figlio: in tal caso l'evento del figlio "sovrascriverà" quello del padre *)
 
===Script===
NB: * in caso si voglia mantenere attivo sia l'evento del padre sia del figlio bisogna usare la function "event_inherited"
Per ''script'' si intendono delle funzioni che accettano parametri in input e restituiscono un valore come risultato dell'elaborazione.
 
===Ereditarietà tra oggetti===
- se una istanza qualunque esegue un codice sull' oggetto parent (mediante la keyword "with") esso verrà eseguito su tutte le istanze di tutti gli oggetti figli
GML supporta l'eriditarietà tipica della [[programmazione ad oggetti]] in modo da ridurre la ridondanza dei codici di un progetto, al fine di ottenere un software meno ingombrante, meno caotico e più manutenibile.
 
- se una funzione viene incaricata di fare un calcolo relativamente un oggetto parent (per esempio trovare l'istanza più vicina) prenderà, durante il calcolo, in considerazione anche tutti gli oggetti figli (a meno che si mettano deliberatamente dei controlli sulla variabile built-in "object_index").
==Array==
gliGli array (dall' inglese schieramento) sono paragonabili a degli insiemi di variabili, per esempio:.
Per esempio, usando le variabili:
<sourcesyntaxhighlight lang=gmlc>
prova1 = 10
prova3 = 7
Riga 253 ⟶ 229:
...
prova40 = 9
</syntaxhighlight>
</source>
stessoStesso codice, ma usando gli array 1Dmonodimensionali:
<sourcesyntaxhighlight lang=gmlc>
prova[1] = 10
prova[3] = 7
Riga 261 ⟶ 237:
...
prova[40] = 9
</syntaxhighlight>
</source>
(i valori tra quadre sono dette indici)
 
Sebbene i due codici paiono pressoché identici ci sono alcune grosse differenze:
* al posto di un indice è possibile mettere il nome di una variabile
* le operazioni di assegnazione o di testing possono essere eseguite in un ciclo (naturalmente tutte le operazioni possono essere messe in un ciclo ma ciclare gli array ne può giustificarne ulteriormente l' utilizzo)
 
Notare che l' indice di partenza è (automaticamente) lo zero, se al [[programmatore]] sembra più comodo può anche partire da 1 (o anche da un valore qualunque), e comunque bene non partire da indici alti altrimenti ci saranno troppi valori allocati inutilmente.
 
Per rendere un array temporaneo (ovvero per liberare la memoria quando i dati non sono più necessari) bisogna crearlo come "variabile temporanea" (vedi sezione dedicata questa pagina alla sezione "variabili" ).
===arrayArray monodimensionale===
èÈ possibile avvalersi di [[array]] 1D:
<sourcesyntaxhighlight lang=gmlc>
sintassi:
num[7] = 10;
</syntaxhighlight>
</source>
ilIl numero 7 verrà memorizzato alla posizione 8 dell' array "num". È da notare che non è prevista una dichiarazione in cui definire le dimensioni massime dell' array.
 
===arrayArray bidimensionali===
È possibile avvalersi di array 2D:
 
<syntaxhighlight lang=c>
è possibile avvalersi di array 2D
<source lang=gml>
num[11,7] = 13
</syntaxhighlight>
</source>
ilIl numero 13 verrà memorizzato "a cooridinatecoordinate" (11,7) dell' array "num".
 
===arrayArray tridimensionali===
Gli array 3D non sono previsti dall'ide di questo linguaggio. È possibile comunque mediante un semplice calcolo matematico trasformare un array 3D in uno 2D. L'array 3D può essere visto come un parallelepipedo formato da tanti parallelepipedi più piccoli: in ognuno di essi c'è memorizzato un dato. Si tratta di "tagliare a fette" il parallelepipedo in tante fette sottili uno, e di metterli tutti adicenti, perdendo così una delle 3 dimensioni (un array che ha una certa "larghezza", "lunghezza", ma spessore 1 ha, in definitiva, 2 sole dimensioni).
 
===Liste e grid (data structure)===
gli array 3D non sono previsti dall' ide di questo linguaggio. È possibile comunque mediante un semplice calcolo matematico trasformare un array 3D in uno 2D. L' array 3D può essere visto come un parallelepipedo formato da tanti parallelepipedi più piccoli: in ognuno di essi c'è memorizzato un dato. Si tratta di "tagliare a fette" il parallelepipedo in tante fette sottili uno, e di metterli tutti adicenti, perdendo così una delle 3 dimensioni (un array che ha una certa "larghezza", "lunghezza", ma spessore 1 ha, in definitiva, 2 sole dimensioni).
===liste e grid (data structure)===
Sono sostanzialmente degli array monodimensionali e bidimensionali.
 
Trad:
* "ds_list"=struttura di dati di tipo lista
 
* "ds_grid"=struttura di dati di tipo griglia
 
La differenza (oltre che nella sintassi) e che queste data structure sono corredate una [[serie di funzioni]] dedicate che gli array "classici" non hanno (almeno non nativamente).
 
NB'''NOTA''': anche queste strutture (come gli array "classici") possono essere rimosse dalla [[RAM]] quando i dati non servono più, pero il meccanismo è diverso: gli array classici per essere rimossi devono essere creati come privati di uno script o piece of code (verranno quindi autorimossi alla fine di esso), invece le liste e griglie sono condivise (obbligatoriamente) e possono essere cancellate (in qualsiasi momento) mediante l'apposita funzione nativa.
==nomenclatura degli elementi==
Quando si crea un nuovo progetto vengono creati oggetti, sprite, rooms, suoni ed altre cose (generalmente visibili in un sistema di cartelle posizionato in alto a sinistra dell' ide). A Ognuno di questi elementi il programmatore da un nome significativo.
 
==Nomenclatura degli elementi==
Spesso si usano delle convenzioni che mirano a evitare ambiguità (che nella migliore delle ipotesi aumenta inutilmente il tempo necessario allo svilluppo del progetto).
Quando si crea un nuovo progetto vengono creati oggetti, sprite, rooms, suoni ed altre cose (generalmente visibili in un sistema di cartelle posizionato in alto a sinistra dell'ide). A ognuno di questi elementi il programmatore da un nome significativo.
 
Spesso si usano delle convenzioni che mirano a evitare ambiguità (che nella migliore delle ipotesi aumenta inutilmente il tempo necessario allo sviluppo del progetto).
molti giochi sviluppati con gm hanno le seguenti convenzioni:
 
Molti giochi sviluppati con gm hanno le seguenti convenzioni:
'''convenzione 1)'''
# Prima convenzione:
#:<code>variabile_che_vuoi</code>
#:<code>obj_giocatore</code>
#:<code>spr_giocatore</code>
#:<code>snd_tuono</code>
#:(Notare che il secondo e il terzo senza prefisso sarebbero indistinguibili, nella migliore delle ipotesi il tutto funzionerà lo stesso, ma il rischio che qualcosa non funzioni o che il codice a lungo andare diventi confusionario è alto)
# Seconda convenzione, usata anche nel gioco [[Spelunky]] di [[Derek Yu]]:
#:<code>variabile_che_vuoi</code>
#:<code>oGiocatore</code>
#:<code>sGiocatore</code>
#:<code>soTuono</code>
 
'''NOTA'''
variabile_che_vuoi
 
I nomi di questi elementi:
obj_giocatore
 
spr_giocatore
 
snd_tuono
 
(Notare che i primi 2 senza prefisso sarebbero indistinguibili, nella migliore delle ipotesi il tutto funzionerà lo stesso, ma il rischio che qualcosa non funzioni o che il codice a lungo andare diventi confusionario è alto)
 
'''convenzione 2)''', usata anche nel gioco [[Spelunky]] di [[Derek Yu]]
 
variabile_che_vuoi
 
oGiocatore
 
sGiocatore
 
soTuono
 
'''NOTE'''
i nomi di questi elementi:
 
* non possono contenere spazi vuoti
 
* non sono visti come delle stringhe, per questo motivo non vanno tra virgolette
 
* sono visti dal computer come contenenti degli id numerici (un po' come delle variabili numeriche di sola lettura).
== Esempi ==
=== Variabili ===
<sourcesyntaxhighlight lang=gmlc>
//Le variabili inizializzate con "var" sono temporanee ed alla fine dell'esecuzione dello script vengono eliminate dalla memoria.
var str, name;
Riga 353 ⟶ 313:
age+=68+1;
str="Ciao "+name+", hai "+string(age)+" anni!";
</syntaxhighlight>
</source>
 
=== Condizioni ===
<sourcesyntaxhighlight lang=gmlc>
if(health<=0)
{
Riga 367 ⟶ 327:
draw_text(mouse_x,mouse_y,health);
}
</syntaxhighlight>
</source>
 
=== While ===
<sourcesyntaxhighlight lang=gmlc>
while(true)
{
Riga 379 ⟶ 339:
}
}
</syntaxhighlight>
</source>
 
=== For ===
<sourcesyntaxhighlight lang=gmlc>
for (i=0;i<ds_list_size(list);i++)
{
Riga 388 ⟶ 348:
instance_create(x_pos,i,obj_muro);
}
</syntaxhighlight>
</source>
 
== Librerie ==
Game Maker funziona principalmente con delle istruzioni "drag and drop", ovvero istruzioni già pronte che contengono dei valori che possono essere modificati a seconda del risultato che si vuole ottenere. Ciascuna istruzione viene chiamata ''azione'', ed è rappresentata da un'icona, ed è di fatto uno script GML o una funzione che l'utente può usare nel gioco. Queste azioni sono raggruppate in librerie, rappresentate graficamente tramite tabelle, di cui ognuna raggruppa tutte le istruzioni che svolgono operazioni simili tra loro (ad esempio, movimento, disegno sullo schermo, ...). Game Maker contiene un set di librerie predefinite, che contengono la maggior parte delle funzioni usate nel gioco.
Le librerie possono essere create con l'Extension Maker per le versioni di Game Maker inferiori alla 8.1. In Game Maker: Studio è possibile creare estensioni all'interno del programma stesso, ed in un futuro vicino saranno multi-piattaforma.
 
== Note ==
<references/>
 
== Collegamenti esterni ==
 
* {{Collegamenti esterni}}
* {{cita web|http://docs.yoyogames.com|Documentazione di Game Maker}}
* {{cita web|http://www.yoyogames.com|YoYo Games}}