Game Maker Language
Author
Albert FloresGame 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.
Syntaxe a sémantika GML
GML kód je strukturovaný podobně jako kód jazyka 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 . :. +more 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. +more 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. +more 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. +more 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í. +more 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). +more 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é konstanty true a false 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. +more 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. +more 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é. +more 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. +more 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)". +more 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. +moredirection. */ 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. +moredirection 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. +more 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
Externí odkazy
[url=http://www. devbook. +morecz/game-maker-hry-zdrojaky-priklady]Udržovaná sekce Game Makeru na Devbooku (solidní tutoriály česky, podpora komunity)[/url] * [url=http://www. erengia. mysteria. cz/]Erengia (Stránky s velkým množstvím návodů, tutoriálů a mnohými dalšími informacemi o Game Makeru)[/url].