Game Maker Language

**Game Maker Language** (**GML**) je skriptovací, objektovo-orientovaný programovací jazyk určený pre použitie v programe vytvorenom s cieľom vytvárať hry – Game Maker.

Existuje aj verzia G-java API, poskytujúca java vývojárom funkcie GML jazyka. Pôvodne ho (jazyk GML) vytvoril Mark Overmars ako základný jazyk programu Game Maker a je kompatibilný s jeho prostredím *drag-and-drop* (ťahaj a polož), ktoré používa rovnakú syntax.

Z drag-and-drop prostredia vyplýva objektovosť jazyka. Nepoužívajú sa pojmy ako "trieda" či "objekt", preferujú sa pojmy "objekt" a "inštancia".

Jazyk je syntaxou podobný C (programovací jazyk). Neobsahuje makrá. Nemá striktnú formu písania. Je veľmi podobný ostatným jazykom, jeho výhodou je, že každý môže použiť svoje zvyky z iných jazykov, napr. použitie "and" namiesto "&&", "!=" a "not", použitie zložených zátvoriek a i. Nepoužívajú sa veľké písmená, ale rozlišuje ich.

## Rozšírenia
Game Maker podporuje od verzie 7.0 "mechanizmus rozšírení". Rozšírenia je možné vytvárať (v jazyku GML) a zdieľať s ostatnými používateľmi na oficiálnych stránkach autora, alebo si ich tam zdarma stiahnuť. Často to bývajú rozšírenia nejakého miesta, pre určitý typ hier, napr. hra viac hráčov, vykresľovanie zložitých útvarov atď. Každá akcia/funkcia je skript v jazyku GML, ktorý môže užívateľ použiť vo vytváranej hre. Game Maker obshauje predvolený súbor knižníc (vstavaných rozšírení) obsahujúcich bežne používané akcie, ako napr. funkcie pre vykresľovanie, matematiku, prácu so súbormi a i.

Pre vytvorenie rozšírenia je možné použiť  Extension Maker .

## Syntax
GML má syntax veľmi podobnú ostatným jazykom (C) a tak je jednoduché si na ňu zvyknúť. Pre zoznam knižníc, ktoré Game Maker obsahuje, stačí stlačiť **F1** a zobrazí sa pomocné okno.

Nerozkazuje ani v použití **{** a **}** či **;**.

```c
if x = 1 x -= 1
```

je to isté ako

```c
if (x = 1)
{
  x -= 1;
}
```

tiež ako

```c
if x = 1
  x -= 1
```


### Operátory
GML používa všetky bežné logické aj matematické operátory. Používa napríklad **xor**, **or**, ale pochopí aj **&&**.


```c
x = x + 1;
```

je to isté ako

```c
x += 1;
```

je v edícií Game Makera **Studio** to isté ako

```c
x++;
```


### Premenné
Game Maker automaticky alokuje pamäť pre všetky premenné, ktoré sú použité/deklarované. Nie je potrebné ich ani deklarovať, stačí im rovno priradiť hodnotu. Inicializácia na určitú hodnotu pri deklarovaní sa dá nastaviť v rámci programu, pôvodná hodnota je **0**. Používa typy Integer (aj keď má rozsah reálneho čísla), String a n-rozmerné polia. Vo forme objektov je možné používať aj vysoko-objektové typy ako mapy, zoznamy,... Obsahuje aj vstavané konštanty, ako napr. **pi** (3.14). Každý objekt má tiež istú sadu premenných, ako napr. **x** (koordináty objektu v sústave x) atď.

```c
var x;
i = 0;
j = 15;
k = i + j; // k = 15
```

Premenné môžu byť **globálne** (použiteľné v celom programe), alebo **lokálne** (len v danom objekte).

```c
global.globalnapremenna = 1;
lokalnapremenna = 1;
```

Použitie mriežky:

```c
if global.PocetNabojov[Samopal] < 10
{
  draw_set_color(c_red);
  draw_text(360,53,"Ostava len" + string(global.PocetNabojov[Samopal]));
}
```


### Cykly
GML má vstavanú väčšinu bežných cyklov. Obsahuje aj jedinečný cyklus **repeat**. Chýba mu však často používaný **for each**. **For each** však ako dodatočný skript vytvoril jeden z používateľov a je možné ho stiahnuť na fórach YoYo Games.

```c
// repeat (počet opakovaní)
i = 0;
repeat 5
{
  i += 1;
} 
// i = 5
```

Použitie vetvenia **with**. Ako objekt sa môže použiť **all**, **self**, **noone**, meno objektu atď.:

```c
//with (objekt)
with (podlaha)
{  	
  if (player.x > podlaha[x] && player.x < podlaha[x] + 32)  	
  {
    player.z = player.z + 8;
  }
}
```

Použitie vetvenia **switch**:

```c
switch druhjablk
{
  case 1: draw_sprite_stretched(spr_1,-1,320,20,50,50); druhjablk_text = "Jonagold"; break;
  case 2: draw_sprite_stretched(spr_2,-1,320,20,50,50); druhjablk_text = "Sungold"; break;
  case 3: draw_sprite_stretched(spr_3,-1,320,20,50,50); druhjablk_text = "Golden Delicious"; break;
  case 4: draw_sprite_stretched(spr_4,-1,320,20,50,50); druhjablk_text = "Silver Delicious"; break;
  case 5: draw_sprite_stretched(spr_5,-1,320,20,50,50); druhjablk_text = "Tehla"; break;
}
```


## Príklady kódu
Gravitačný systém v 3D hre:

```c
if padam = 1
{
  if zspeed < rychlost rychlost = zspeed
  else if zspeed = 0
  {
    padam = 0;
    if ((rychlost < -7) and (rychlost >= -9))
    {
      obj_player.health += rychlost;
    }
    else if ((rychlost < -9) and (rychlost >= -10))
    {
      obj_player.health += 2 * rychlost;
    }
    else if ((rychlost < -10) and (rychlost >= -13))
    {
      obj_player.health += 3 * rychlost;
    }
    else game_end(); 
    rychlost = 0;
  }   
}
```

Klasický pohybový systém v 3D hre:

```c
if keyboard_check(ord('W')) or keyboard_check(vk_up)motion_add(yaw    ,1)
if keyboard_check(ord('A')) or keyboard_check(vk_left)motion_add(yaw+90 ,1)
if keyboard_check(ord('S')) or keyboard_check(vk_down)motion_add(yaw+180,1)
if keyboard_check(ord('D')) or keyboard_check(vk_right)motion_add(yaw+270,1)
speed*=.75
```

Skript na náhodnú farbu:

```c
return choose(c_black,c_red,c_navy,c_lime,c_yellow,c_dkgray,c_purple,c_gray,c_white);
```

Skript na demoverziu hry:

```c
if global.demoverzia = 1
{
  registry_set_root(0);
  if registry_exists_ext('\Software\removethis','removethis')
  {
    show_message("This is only a demo version. To continue playing please download the full version.");
    game_end();
  }
  instance_create(0,0,obj_limitatorfunkcii);
}
```
*Od verzie GameMaker Studio nie je možné pracovať s registrami a inými prvkami Windows, keďže nepodporujú multiplatformové ambície tvorcov.

## Referencie

Kategória:Skriptovacie jazyky