Game Maker Language
Game maker language (GML) je skriptovací programovací jazyk, který je použit ve vývojovém prostředí Game Maker. Toto IDE se stará i o překlad do spustitelného souboru. Má syntaxi podobnou C s možností použití i syntaxe Pascalu. Vytvořil jej Mark Overmars.
Vývojář | YoyoGames Ltd. |
---|---|
Aktuální verze | 2.0.5.77 (2017) |
Operační systém | Windows, Mac, Linux, IPad, Android, IPhone |
Typ softwaru | Programovací jazyk |
Licence | Shareware |
Web | www.yoyogames.com/gamemaker/ |
Některá data mohou pocházet z datové položky. |
Syntaxe a sémantika GML
GML kód je strukturovaný podobně jako kód jazyku C. Řádky kódu mohou být ukončeny středníkem, ale není to vyžadováno.
GML používá mnoho operátorů známých z C jako například: +=
, -=
, *=
, /=
nebo ?:
. Některé operátory je možné zapsat několika způsoby, například operátor rovnosti lze zapsat jako =
nebo ==
.
Funkce
Game Maker obsahuje knihovnu vestavěných funkcí. Programátor též může vytvořit skripty, které lze volat stejně jako funkce. Kreslící funkce využívají Direct3D API.
GM má též vestavěné funkce pro volání externích DLL. Tedy, mnoho funkcionality, která není přístupná skrze GML, tedy může být přidána skrze DLL.
Proměnné
Stejně jako v mnoha jiných skriptovacích jazycích není v GML nutno proměnné deklarovat. Proměnná je vytvořena tehdy, když je nastavena na nějakou hodnotu. Avšak proměnné se dají i deklarovat pomocí klíčových slov var
a globalvar
. Pro práci s globálními uživatelem definovanými proměnnými se dá použít prefix global
(například global.lokace=5
). Obdobně pro přístup k členským proměnným se používá jako prefix jméno instance.
Uživatelem definované proměnné mohou být lokální a globální, přičemž lokální je výchozí. Existují také předdefinované proměnné a konstanty. Každá instance objektu v programu má množinu vestavěných lokálních členských proměnných jako například "x" a "y". Dále existují globální vestavěné funkce jako "score".
Datové struktury
Je možno deklarovat i pole a jiné datové struktury.
Pole (array) mohou mít jeden či dva rozměry a mohou obsahovat libovolnou kombinaci řetězců (string) a reálných čísel (real). Nemohou být ani parametry, ani návratovými hodnotami funkcí. Limity na velikost pole jsou tyto: pole mohou mít maximálně 32 000 prvků a celkem maximálně 1 000 000 prvků.
Další možné datové struktury jsou zásobník (stack), fronta (queue), seznam (list), slovník (map), fronta s prioritou (priority queue) a tabulka (grid). Tyto jsou přístupné jedině v placené verzi Game Maker Standard.
Datové typy
Aby jazyk byl co nejjednodušší, tak používá jen dva datové typy: reálná čísla a řetězce.
- Řetězec (string) – uspořádaná skupinu znaků z ASCII tabulky. Délka řetězce může být až 4 294 967 296. Jestliže řetězec překročí tuto velikost, je oříznut.
- Reálná čísla (real) – reprezentace reálného čísla se znaménkem. Je možno použít i šestnáctkovou reprezentaci reálných čísel pomocí znaku $ (příklad
cislo=$A //tedy 10 v desitkove soustave
). Jazyk GML nepoužívá typ boolean. Pro logické proměnné a podmínky se používá datový typ real s tím, že hodnoty menší, nebo rovno 0 se považují za nepravdu/false a větší za pravdu/true. Takže se dají používat hodnoty 0 pro false a 1 pro true, jak je zvykem v jiných programovacích jazycích. Existují také konstantytrue
afalse
reprezentující čísla 1 a 0.
Viditelnost proměnných
V jazyce GML jsou dva typy lokálních proměnných – vzhledem k instanci objektu a vzhledem ke skriptu. Lokální proměnnou vůči instanci lze volat pouze s prefixem proměnné nebo pomocí klíčového slova with. Proměnné lokální vůči skriptu jsou viditelné jedině během běhu skriptu a na konci skriptu jsou uvolněny. Když je proměnná vytvořena pomocí přiřazení, je vytvořena jako instančně lokální, ale existuje i po konci běhu skriptu. Pro deklaraci lokální proměnné ve skriptu se používá klíčové slovo var
(například var foo, bar;
).
Existují i globální proměnné, které se definují pomocí klíčového slova globalvar
anebo prefixu global.
, při čemž platí, že k proměnným vytvořeným s prefixem global.
se vždy přistupuje pomocí tohoto prefixu a k těm vytvořeným pomocí klíčového slova globalvar
se přistupuje bez jakéhokoli prefixu.
Jestliže je více skriptů spuštěno najednou, nelze použít jiný způsob jak přistoupit k lokální proměnné jiného skriptu než tak, že ji předáme jako atribut funkce.
Alokace proměnných
GML automaticky alokuje paměť pro proměnné při prvním použití a používá dynamické typování. Přiřazení hodnoty do proměnné jiného typu je možné. GML neposkytuje žádné rozhraní na uvolnění jednou alokované proměnné. Paměť je uvolněna automaticky až skončí skript či instance je zrušena.
Identifikace a odkazování na instance
GML nepodporuje ukazatele, tedy se musí využít jiné techniky k odkazování na data v paměti. Každá instance v GML má jedinečné ID, která se dá použít jako reference na ni. Toto ID lze získat pomocí vestavěné funkce id.
Příklady kódu
Následují příklady kódu.
Úsek kódu Hello world zobrazující text ve vyskakovacím okně:
show_message("Hello World!");
Stejný příklad jako minulý, avšak text vypisuje do herního okna na počátek souřadnic. Většinou je nutné tento kód psát do draw eventu.
draw_text(0, 0, "Hello World!");
Komentovaná ukázka z kódu hry napsaná v GML.
// Toto je komentar.
/* Toto je blokovy komentar. */
/* Deklarace lokalnich promennych, ktere budou uvolneny na konci skriptu.
Vsimnete si, ze deklarace neobsahuje typy promennych */
var xx, yy, nn;
// Podminka. Muze byt zkracena na "if (can_shoot)".
if (can_shoot = true) // "=" a "==" muze oboji byt pouzito v podminkach jako zapis porovnani.
{ // Zacatek bloku kodu. Je mozno taky pouzit "begin" jako v Pascalu.
/* Nastaveni promenne na false. Muze byt taky napsano takto: "can_shoot = 0;",
protoze GML nerozlisuje mezi typy boolean a real. */
can_shoot = false;
/* Zde se nastavi nulty alarm na pet. Promenna alarm bude automaticky snizovana.
Kdyz bude dosazena nula bude vyvolan alarm0 event. */
alarm[0] = 5;
/* Zde lokalni promenna xx definovana jako cele cislo (integer)
a funkce lengthdir_x je pouzita. */
xx = x + lengthdir_x(14, direction);
yy = y + lengthdir_y(14, direction);
// Toto vytvori obj_bullet a nasledne vrati jeji instance id do nn.
nn = instance_create(xx, yy, obj_bullet);
/* Klicové slovo with zpristupnuje clenske promenne objektu primo,
bez nutnosti zapisovat vyrazy jako nn.speed nebo nn.direction. */
with (nn)
{
speed = obj_tank.speed + 3;
direction = obj_tank.direction;
}
}
GML podporuje vice typu syntaxe. Jako příklad může být přepsaní předchozího příkladu v syntaxi podobné Pascalu:
var xx, yy, nn;
if can_shoot = true then begin
can_shoot := false
alarm[0] := 5
xx := x + lengthdir_x(14, direction)
yy := y + lengthdir_y(14, direction)
nn := instance_create(xx, yy, obj_bullet)
with nn begin
speed := obj_tank.speed + 3
direction := obj_tank.direction
end
end
Toto je příklad jednoduchého pohybu ovládaného klávesnicí. Funkce motion_set
má dva parametry: směr ve stupních a rychlost v pixelech za krok programu. Její volání nastaví vestavěné lokání proměnné "speed" and "direction" , které Game Maker používá automatickou změnu pozice instance. Tato změna nastává v každém kroku. Pozice instance může být změněná i přímo pomocí nastavení vestavěných proměnných "x" a "y".
if (keyboard_check(vk_left)) motion_set(180,4);
if (keyboard_check(vk_up)) motion_set(90,4);
if (keyboard_check(vk_right)) motion_set(0,4);
if (keyboard_check(vk_down)) motion_set(270,4);
if (keyboard_check(vk_nokey)) motion_set(0,0);
Zde je uvedena komplexnější alternativa volání motion_set(180, 4)
, která kontroluje zda je místo ve směru posunu.
if (!place_free(x-4,y))
{
if (place_free(x-4,y-4))
{
x-=4;
y-=4;
}
else if (place_free(x-3,y-5))
{
x-=3;
y-=5;
}
else if (place_free(x-2,y-6))
{
x-=2;
y-=6;
}
}
else
x-=4;
Ukázka volání Direct3D procedury.
d3d_draw_floor(0,0,0,500,600,1,background_get_texture(background1),.01,.01);
Reference
V tomto článku byl použit překlad textu z článku Game Maker Language na anglické Wikipedii.