Game Maker Language: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
Correzione errori di battitura Etichette: Modifica da mobile Modifica da web per mobile |
m Little edits |
||
(27 versioni intermedie di 16 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}}
{{
{{W|informatica|aprile 2018}}
{{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 [[
* Attraverso script per la creazione di funzioni personalizzate;
* Interagendo con gli eventi è possibile controllare il comportamento di tali oggetti;
Riga 13 ⟶ 32:
==Oggetti==
Se si desidera usare il GML è importante capire come funzionano gli oggetti in questo linguaggio.
# crea degli oggetti (vuoti) Esistono
# ad icone # a codice # 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 26 ⟶ 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).
* '''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
L'[[assegnazione]] di un dato avviene nel seguente modo:
<
nome_variabile = dato_che_vuoi;
</syntaxhighlight>
È chiaro che prima di accedere a una variabile bisogna almeno una volta fare un'assegnazione che
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]].
====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:
<
tempo = tempo - 1
</syntaxhighlight>
<
tempo -= 1
</syntaxhighlight>
====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) è che esse hanno già un'inizializzazione.
==Eventi==
Ecco alcuni eventi a disposizione del programmatore:
Riga 62 ⟶ 87:
* '''create_ev'''
* '''step_ev'''
* '''mouse_ev'''
* '''mouse_global_ev'''
* '''draw_ev'''
* '''any_key_press_ev'''
* '''any_key_pressed_ev'''
<
any_key_pressed_ev
{
Riga 101 ⟶ 126:
azione3
}
</syntaxhighlight>
e equivalente a
<
step_ev
if (keyboard_check_pressed(any_key))
Riga 111 ⟶ 136:
azione3
}
</syntaxhighlight>
==Function==
<
data_out = funct_name(data_in1, data_in2, data_in3 ecc.)
</syntaxhighlight>
Allo stesso modo se una function restituisce un dato significativo la parte "data_out =", sebbene generalmente consigliata, non è obbligatoria.
==If e blocchi di istruzioni==
Sintassi:
<
if (condizione)
{
Riga 137 ⟶ 163:
azione3
}
</syntaxhighlight>
I
Esempio:
<
if (num > 3)
{
show_message("il numero è maggiore di 3")
Riga 150 ⟶ 177:
show_message("il numero è uguale o minore a 3")
}
</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:
<
if (instance_exists(oggetto_stella)) {
show_message("esiste almeno un oggetto stella")
Riga 162 ⟶ 190:
show_message("nessun oggetto stella presente")
}
</syntaxhighlight>
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.
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.
*'''==''' (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
*'''>''' - 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>
*'''&&''' - [[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.
==Eliminare ridondanza non necessaria==
===Script===
Per ''script'' si intendono delle funzioni che accettano parametri in input e restituiscono un valore come risultato dell'elaborazione.
===Ereditarietà tra oggetti===
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.
==Array==
Per esempio, usando le variabili:
<
prova1 = 10
prova3 = 7
Riga 252 ⟶ 229:
...
prova40 = 9
</syntaxhighlight>
<
prova[1] = 10
prova[3] = 7
Riga 260 ⟶ 237:
...
prova[40] = 9
</syntaxhighlight>
Sebbene i due codici paiono pressoché identici ci sono alcune grosse differenze:
Riga 269 ⟶ 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"
===
<
sintassi:
num[7] = 10;
</syntaxhighlight>
===
È possibile avvalersi di array 2D:
<syntaxhighlight lang=c>
num[11,7] = 13
</syntaxhighlight>
===
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.
Riga 296 ⟶ 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).
'''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.
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:
# 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'''
I nomi di questi elementi:
* non possono contenere spazi vuoti
Riga 337 ⟶ 301:
== Esempi ==
=== Variabili ===
<
//Le variabili inizializzate con "var" sono temporanee ed alla fine dell'esecuzione dello script vengono eliminate dalla memoria.
var str, name;
Riga 349 ⟶ 313:
age+=68+1;
str="Ciao "+name+", hai "+string(age)+" anni!";
</syntaxhighlight>
=== Condizioni ===
<
if(health<=0)
{
Riga 363 ⟶ 327:
draw_text(mouse_x,mouse_y,health);
}
</syntaxhighlight>
=== While ===
<
while(true)
{
Riga 375 ⟶ 339:
}
}
</syntaxhighlight>
=== For ===
<
for (i=0;i<ds_list_size(list);i++)
{
Riga 384 ⟶ 348:
instance_create(x_pos,i,obj_muro);
}
</syntaxhighlight>
== 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.
Riga 393 ⟶ 358:
== Collegamenti esterni ==
* {{Collegamenti esterni}}
* {{cita web|http://docs.yoyogames.com|Documentazione di Game Maker}}
* {{cita web|http://www.yoyogames.com|YoYo Games}}
|