# Game Maker Language

Game Maker Languaje (GML) és un llenguatge de programació interpretat (posteriorment van afegir la possibilitat d'utilitzar l'opció de YoYoCompiler, que pot ser compilat) desenvolupat per poder utilitzar-se com a complement de l'aplicació de creació de jocs Game Maker. El llenguatge és utilitzat en el programa per potenciar el desenvolupament de jocs i també altres sistemes. El llenguatge va ser codificat usant el llenguatge Delphi.
És un llenguatge de programació molt flexible, la seva sintaxi és comparable amb la de C++ o Java, encara que també es va veure influenciat per la sintaxi d'altres llenguatges com Pascal. L'estructura general del codi GML pot tenir diferents formes de sintaxi, ja que no té una sintaxi estricta com la de C, donant major flexibilitat. Pot treballar amb nombres, cadenes de text i altres tipus de manera nativa.

## Sintaxi general

El llenguatge GML és molt similar al C++, però consta de molta més flexibilitat degut a diverses variacions que presenta (totes són vàlides).
Per exemple, quan es treballa amb operadors pot funcionar així:
Però en GML també és vàlid d'aquesta forma:
Aquesta regla d'operadors també és aplicable en /=, -= y *=.
A més a més, el llenguatge GML no obliga l'ús reglamentari del símbol ";" al final de cada línia o funció, fent més flexible l'aspecte estricte de la sintaxi.

## Funcions

El llenguatge GML incorpora un gran nombre de funcions i sistemes implementats que ja estan incorporats en el mateix programa que es treballa, és a dir, no són necessàries llibreries externes com en altres llenguatges (C++ por exemple), encara que permet utilitzar llibreries externes en format DLL per ampliar i potenciar alguns aspectes del sistema.

## Variables i àmbit on actuen

GML no obliga a declarar les variables com a tal per poder accedir a elles, només cal assignar-li un valor fix una vegada. Per exemple:
En aquest cas, la variable ja està declarada i es pot utilitzar de forma general. Quan es declara la variable d'aquesta manera, aquesta variable només pot treballar dintre de l'objecte. Així es pot utilitzar el mateix nom de variable en un altre objecte. D'això se'n diu que és una variable local.
Igualment, GML també inclou un bloc "var" similar a les declaracions de variables d'altres llenguatges, fent que aquestes variables es puguin declarar sense assignar-li un valor (que serà automàticament el 0, com en C++). Per exemple:
Aquesta variable també es considera com una variable local, però el seu àmbit es redueix encara més, fent que només és accessible dintre del codi o script que s'ha afegit. Així es pot crear variables temporals sabent que seran destruïdes un cop acabi el codi aquesta part del codi.
Per una altra banda, tenim també les variables globals, que es diferencien perquè s'utilitza el prefixe global. abans del nom de la variable, per exemple:
Les variables globals es poden utilitzar en tot el programa, per tant, només existeix una sola variable global amb el mateix nom, i el seu valor pot canviar-se des de qualsevol paràmetre del programa/codi.
GML també utilitza arrays d'una manera molt simple i similar a C++.
Es declaren de la següent forma:
Les arrays a Game Maker poden ser d'una o dues dimensions i poden contenir strings i valors numèrics, però no altres arrays. També existeix un límit en la mida, els índexs tenen en rang entre 0 i 32.000 i no pot haver-hi més d'1.000.000 de valors en una mateixa array.
GML pot utilitzar també constants, dintre del programa s'anomenen macros, que no deixen de ser variables on es dona un valor inicial i no pot canviar en cap lloc del codi.
GML també té funcions utilitzades per crear i editar estructures de dades simples que poden assignar-se a una variable. Les estructures de dades són Stacks o piles, Queues o cues, Llistes, Mapes, Queues de prioritat i Grids.

### Tipus

Por la seva simplicitat, GML només conté dos tipus de variables.Qualsevol variable pot tenir tipus de dades sense declarar-se.
* Strings Són cadenes de caràcters ASCII (o Unicode y ANSI en cas de GM 8.1 o una versió superior) que poden tenir qualsevol longitud. Com GM prefixa la mida dels string com valors sencers de 4 bytes, un string en realitat no pot tenir més de 4,294,967,296 caràcters. Si un string supera aquest nombre, el text es talla des del començament fins aquest límit. Però el més habitual és que siguin moltíssim més curtes.
* Valors Reals Són nombres amb signe de punt flotant. Això vol dir que poden ser nombres positius o negatius i que poden tenir una part decimal. Des de la versió 6.1, GM permet la representació de valors hexadecimals com reals en el codi, si es precedeix amb el caràcter $. En la versió 6, utilitzar valors reals tenia un bug que provocava errors de precisió si es treballava amb valors reals alts. El bug també existeix en GM 7 y 8, pero es va fer més precisió per disminuir l'error.
Com GML no conté valors booleans, sentències que requereixen valors booleans (com if) avaluarà qualsevol valor real major que 0.5 com true i qualsevol valor menor o igual a 0.5 com a false. En GML també existeixen les constants de sistema true i false que són 1 i 0 respectivament, i poden ser utilitzades per fer el codi més llegible.
Els valors de dates també s'emmagatzema com un nombre, però Game Maker conté funcions per facilitar el tractament d'aquestes dates.
* Enum En la versió recent de Game Maker Studio s'ha incorporat l'opció d'enumeracions, que és un llistat de constants que una variable pot contenir.

#### Instàncies

Una instància és la creació d'un objecte per utilitzar en el joc. Com hem comentat, una variable és local d'una instància però no local al script on s'utilitza. Per fer una variable accessible a totes les instàncies i scripts es defineix amb el prefixe global global.foo=bar; o declarant explícitament globalvar foo,bar;. Per fer una variable local a un script s'utilitza la paraula clau var: var foo,bar;.
Es pot accedir a una variable local d'una instància des de qualsevol instància utilitzant com a prefixe un identificador d'instància instancia.variable. No hi ha forma d'accedir a una variable local d'un script des d'un altre, a no ser que la variables es passi d'un script a un altre com argument o paràmetre.
Una instància pot executar codi en una altra instància utilitzant la sentència "with". Per exemple, el següent tros de codi, que està dintre d'un event col·lisió, pot ser utilitzada per destruir la instància que col·lideix amb l'actual. Quan s'executa l'event col·lisió, Game Maker automàticament crea la variable "other", per referir-se a la instància que està implicada en la col·lisió.

## Sentències d'execució

Game Maker conté les sentències d'execució més comunes del llenguatges de programació, com són els condicionals i els bucles. A continuació veurem un exemple de la seva sintaxi.