Game Maker Language: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
m Little edits
 
(11 versioni intermedie di 11 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}}
{{F|informaticalinguaggi di programmazione|settembre 2017}}
{{W|informatica|aprile 2018}}
{{tmp|linguaggioLinguaggio 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 [[YoYoGamesYoYo 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.
 
LeI possibilitàmodi diin interazionecui è possibile interagire con gli ''oggetti'' presenti nel gioco attraversotramite GML possono essere riassunteriassunti come cosìsegue:
* Attraverso script per la creazione di funzioni personalizzate;
* Interagendo con gli eventi è possibile controllare il comportamento di tali oggetti;
Riga 14 ⟶ 32:
==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)
*# associa agli oggetti, se vuole, degli [[sprite (informatica)|sprite]] (ovvero degli elementi grafici)
*# "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).
 
Mediante un [[editor grafico]] si inseriscono gli oggetti (ovvero si creano quelle che vengono chiamate "[[istanza di oggetto]]") in un'area denominata stanza.
Riga 27 ⟶ 49:
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).
 
esisteEsiste 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)
Riga 35 ⟶ 57:
 
===Dichiarazione e assegnazione di dato a una variabile===
Come accade in molti linguaggi di scripting, anche in GML è prevista una dichiarazione implicita delle variabili, non sarà quindi necessario indicare tipo e dimensione della variabile a livello di definizione della stessa, quando si ha la necessità di un certo tipo di variabile si deovràdovrà effettuarne direttamente l'inizializzazione. Fanno eccezione le variabili globali e locali, identificate rispettivamente con le parole chiave ''globalvar'' e ''var'', la loro dichiarazione rappresenta quindi solo l'intenzione di assegnare uno ''scope'' alla variabile senza comunque dover indicarne il tipo e la dimensione.
 
L'[[assegnazione]] di un dato avviene nel seguente modo:
<syntaxhighlight lang="gmlc">
nome_variabile = dato_che_vuoi;
</syntaxhighlight>
È chiaro che prima di accedere a una variabile bisogna almeno una volta fare un'assegnazione che ne inizializzi il 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. NB'''NOTA''': 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 è dato dal contare: quando un software fa comparire a schermo un conto alla rovescia non fa altro che eseguire (ciclicamente) questo comando:
<syntaxhighlight lang="gmlc">
tempo = tempo - 1
</syntaxhighlight>
oppureOppure, in forma abbreviata:
<syntaxhighlight lang="gmlc">
tempo -= 1
</syntaxhighlight>
Riga 59 ⟶ 81:
 
==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:
Riga 65 ⟶ 87:
* '''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'''
 
questoQuesto evento si scatena quando il giocatore clicca su un'istanza che 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:
 
<syntaxhighlight lang="gmlc">
any_key_pressed_ev
{
Riga 106 ⟶ 128:
</syntaxhighlight>
e equivalente a
<syntaxhighlight lang="gmlc">
step_ev
if (keyboard_check_pressed(any_key))
Riga 117 ⟶ 139:
 
==Function==
leLe [[Funzione (informatica)|function]] hanno questa sintassi:
<syntaxhighlight lang="gmlc">
data_out = funct_name(data_in1, data_in2, data_in3 ecc.)
</syntaxhighlight>
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:
sintassi:
<syntaxhighlight lang="gmlc">
if (condizione)
{
Riga 143 ⟶ 165:
</syntaxhighlight>
 
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:
<syntaxhighlight lang="gmlc">
if (num > 3)
{
Riga 156 ⟶ 178:
}
</syntaxhighlight>
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:
<syntaxhighlight lang="gmlc">
if (instance_exists(oggetto_stella))
{
Riga 175 ⟶ 197:
 
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.
;operatoriOperatori 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 disugualianzadisuguaglianza tra i 2 dati, altrimenti false.
 
;operatoriOperatori 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.
 
;operatoriOperatori 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>
*'''&&''' - [[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.
Riga 199 ⟶ 221:
 
==Array==
gliGli array (dall'inglese schieramento) sono paragonabili a degli insiemi di variabili, per esempio:.
Per esempio, usando le variabili:
<syntaxhighlight lang=gmlc>
prova1 = 10
prova3 = 7
Riga 208 ⟶ 230:
prova40 = 9
</syntaxhighlight>
stessoStesso codice, ma usando array monodimensionali:
<syntaxhighlight lang=gmlc>
prova[1] = 10
prova[3] = 7
Riga 223 ⟶ 245:
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" ).
===Array monodimensionale===
èÈ possibile avvalersi di [[array]] 1D:
<syntaxhighlight lang=gmlc>
sintassi:
num[7] = 10;
</syntaxhighlight>
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.
 
===Array bidimensionali===
èÈ possibile avvalersi di array 2D:
<syntaxhighlight lang=gmlc>
num[11,7] = 13
</syntaxhighlight>
ilIl numero 13 verrà memorizzato "a coordinate" (11,7) dell'array "num".
 
===Array tridimensionali===
Riga 248 ⟶ 270:
* "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 Ognunoognuno 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 svillupposviluppo del progetto).
 
moltiMolti giochi sviluppati con gm hanno le seguenti convenzioni:
# 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)
'''convenzione# 2)'''Seconda convenzione, usata anche nel gioco [[Spelunky]] di [[Derek Yu]]:
#:<code>variabile_che_vuoi</code>
#:<code>oGiocatore</code>
#:<code>sGiocatore</code>
#:<code>soTuono</code>
 
'''convenzione 1)NOTA'''
 
iI nomi di questi elementi:
variabile_che_vuoi
 
obj_giocatore
 
spr_giocatore
 
snd_tuono
 
(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)
 
'''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
Riga 290 ⟶ 301:
== Esempi ==
=== Variabili ===
<syntaxhighlight lang=gmlc>
//Le variabili inizializzate con "var" sono temporanee ed alla fine dell'esecuzione dello script vengono eliminate dalla memoria.
var str, name;
Riga 305 ⟶ 316:
 
=== Condizioni ===
<syntaxhighlight lang=gmlc>
if(health<=0)
{
Riga 319 ⟶ 330:
 
=== While ===
<syntaxhighlight lang=gmlc>
while(true)
{
Riga 331 ⟶ 342:
 
=== For ===
<syntaxhighlight lang=gmlc>
for (i=0;i<ds_list_size(list);i++)
{
Riga 347 ⟶ 358:
 
== Collegamenti esterni ==
 
* {{Collegamenti esterni}}
* {{cita web|http://docs.yoyogames.com|Documentazione di Game Maker}}
* {{cita web|http://www.yoyogames.com|YoYo Games}}