Jazyk Game Makeru | |
---|---|
Jazyková třída | objektově orientovaný , událostně orientovaný , skriptovaný |
Objevil se v | 1999 |
Autor | Marcus Overmars |
Vývojář | Overmars, Markus Hendrik |
Přípona souboru | .gml , .gmk , .gm6 , .gmd , .gm8 , .gm81 |
Byl ovlivněn | C++ |
webová stránka | yoyogames.com |
OS | Microsoft Windows |
Game Maker Language (GML) je interpretovaný programovací jazyk navržený pro použití ve spojení s programem pro vývoj počítačových her s názvem Game Maker . Jazykovou podporu původně do Game Makeru zavedl Mark Overmars , aby doplnil systém událostí tlačítek, později však byly všechny události tlačítek zahrnuty do GML, což umožnilo programátorovi vyhnout se používání funkcí tlačítek. GML velmi silně souvisí s prostředím Game Maker. Game Maker je navržen tak, aby eliminoval potřebu ručního programování věcí, jako je správa událostí, návrh úrovní a nastavení objektů. Existuje mylná představa, že GML podporuje vkládání úryvků kódu v jiných jazycích, jako je Pascal , Assembler nebo C++ . Mylná představa vznikla kvůli částečné podobnosti syntaxe GML s Pascalem a C++. (Například operátor „&&“ lze nahradit „a“).
V Game Makeru tvoří knihovnu kolekce událostí tlačítek. V rozhraní programu se knihovny zobrazují jako záložky obsahující různé ikony událostí. Každá taková událost je GML skript nebo funkce, kterou může uživatel ve hře použít. Game Maker je dodáván s několika standardními knihovnami, které obsahují hlavní události používané ve většině her. Pomocí Library Makeru je také možné vytvářet vlastní knihovny . GMS2 má vestavěný mechanismus pro převod akcí tlačítek na kód GML a naopak, což začátečníkům umožňuje rychle přejít na GML a zlepšuje pochopení toho, jak fungují standardní akce.
GML je strukturálně podobný jazyku, s bloky kódu, voláním funkcí, přiřazením proměnných, syntaxí operátorů a tak dále. GML rozlišuje mezi příkazy a výrazy. Například,
g < 1;není platné prohlášení a způsobí chybu. Také přiřazení proměnné je vždy operátor, a proto jej nelze použít ve výrazech. Například následující řádek by vždy vygeneroval chybu, protože by vyhodnotil vnořený výraz jako true nebo false a pak by porovnal booleovský výsledek s řetězcem "Ano" (nesprávné srovnání):
if ((odpověď = get_string("Ano nebo Ne?", "")) == "Ano")Stojí za to připomenout, že znaménko rovná se "=" je operátor přiřazení a booleovský porovnávací operátor ve výrazech, zatímco v C ++ se ve výrazech zapisuje dvojité znaménko "==". Dvojité rovnítko "==" však bude při použití ve výrazech interpretováno správně. Použití takového znaku jako operátoru přiřazení způsobí běhovou chybu. GML také podporuje inkrementační operátory :
g++; // podporována notace postfixu i prefixua
g + = 1;stejný jako
g = g + 1;Existují také operátory: -=, *=, /=, |=, &= a ^=. Počínaje GMS2 byla zavedena podpora ternárního operátora ?: . Operátory v GML mohou být odděleny středníky, ale není to vyžadováno (ačkoli to může v některých specifických případech vést k chybě).
Game Maker obsahuje rozsáhlou knihovnu vestavěných funkcí , které poskytují základní funkce. Programátor může vytvářet své vlastní skripty, které se volají úplně stejným způsobem jako funkce. Kreslicí funkce v Game Makeru využívají rozhraní Direct3D API . V případě potřeby umožňuje Game Maker také volat nativní kód platformy prostřednictvím rozšíření (DLL na Windows, Java na Androidu, JS na HTML5 atd.).
GML obvykle nemusí předem deklarovat proměnnou, jako to dělají některé jiné jazyky. Proměnná se vytvoří automaticky ihned po přiřazení hodnoty:
foo="bar";Game Maker má mnoho vestavěných proměnných a konstant . Každá instance objektu obsahuje mnoho lokálních proměnných, například "x" a "y". Existuje také několik vestavěných globálních proměnných, jako je "skóre". Tyto proměnné existují nezávisle na instancích objektu. Tyto proměnné neobsahují předponu " global ", na rozdíl od globálních proměnných zadaných programátorem. Podporována jsou také jednorozměrná a dvourozměrná pole .
GML má funkce pro vytváření a úpravu šesti typů datových struktur : zásobník , fronta , seznam , mapa (asociativní pole), prioritní fronta a mřížka. K mřížce, seznamu a mapě lze také přistupovat prostřednictvím přístupových prvků, které poskytují syntaxi podobnou poli:
hodnota var = seznam[| 0]; // místo ds_list_find_value(list, 0) mapa[? "name"] = "Uživatelské jméno"; // místo ds_map_add(map, "name", "Username") hodnota var = mapa[? "název"]; // místo ds_map_find_value(map, "name");GML podporuje následující typy dat:
Zatímco GML lze považovat za objektově orientovaný jazyk, povaha objektů a instancí objektů v Game Makeru vytváří některé důležité rozdíly ve způsobu oddělování proměnných. Existují dva typy lokality: lokalita v objektu a lokalita ve skriptu (nebo jiné části kódu obsažené v samostatném kontejneru). Skutečnost, že proměnná je lokální pro instanci objektu, znamená, že proměnná je vázána na konkrétní instanci objektu a může být použita pouze zvenčí této instance s předponou, která tuto instanci definuje; skutečnost, že proměnná je pro skript lokální, znamená, že proměnnou lze použít pouze v tomto skriptu (a je zničena, když skript skončí). Od nynějška bude pojem „místní“ znamenat lokalitu v objektu. Ve výchozím nastavení je proměnná lokální pro objekt, ale není lokální pro skript, ve kterém je použita. Aby byla proměnná dostupná všem instancím objektů, lze ji definovat prostřednictvím globálního jmenného prostoru :
global .foo = "bar";Je také možné deklarovat globální proměnné pomocí klíčového slova globalvar :
globalvar foo, bar;Této metodě je ale třeba se vyhnout, protože může snadno vést k těžko odhalitelným chybám kvůli průniku proměnných rozsahů (totéž doporučují samotní vývojáři GMS, navíc je možné, že v budoucnu bude toto klíčové slovo zcela odstraněn z jazyka – v tuto chvíli je ponechán pouze z důvodů zpětné kompatibility). Aby byla proměnná lokální pro skript, musí být definována takto:
var foo, bar;Rozsah lokální proměnné je skript, ve kterém je deklarována. To znamená, že bude stále k dispozici na kontextovém přepínači (pomocí s ). Například:
var foo = "bar"; s ostatními { show_message(foo); // proměnná foo je k dispozici }K lokálním proměnným objektu lze přistupovat pomocí identifikátoru instance objektu jako prefixu
instance.varnametímto způsobem však není možné získat lokální proměnné jednoho skriptu z druhého, pokud nejsou předány jako parametry funkce. Aktuální jmenný prostor objektu lze změnit pomocí konstrukce " with ". Například následující skript, pokud je umístěn do události kolize , zničí druhou instanci objektu, který se této události účastní (všimněte si, že v události kolize Game Maker automaticky nastaví proměnnou other na druhou instanci objektu, který byl se srazil):
s ostatními { instance_destroy(); }GML automaticky alokuje paměť pro proměnné za běhu a používá dynamické typy , takže je také možné přiřazovat hodnoty různých typů proměnným. Můžete například nejprve vytvořit celočíselnou proměnnou a poté ji změnit na řetězec:
intNumber = 1; intNumber = "Tato proměnná nyní obsahuje řetězec";V GML neexistuje žádná speciální funkce, která by vám umožnila uvolnit paměť obsazenou proměnnou, nicméně v případě potřeby můžete proměnné přiřadit novou, menší hodnotu. Pokud máte například proměnnou, která ukládá velký text, nastavení proměnné na prázdný řetězec může uvolnit paměť. Totéž platí pro pole:
data = [1, 2, 3, 4, 5]; // vytvořilo pole (tato syntaxe pro vytváření polí je dostupná od GMS2) data = 0; // zničil pole (nyní je to jen proměnná)Když je objekt zničen, všechny jeho lokální proměnné jsou také zničeny a jakékoli globální proměnné existují nezávisle na nich. Proto by měly být upřednostněny lokální proměnné a globální proměnné by se měly používat pouze v případě, že je to skutečně nutné. Pro efektivnější ukládání velkého množství informací podporuje Game Maker několik datových struktur, jako je zásobník, fronta, seznam, mapa, prioritní fronta a mřížka. Tyto struktury jsou vytvářeny, upravovány a ničeny prostřednictvím vestavěných funkcí. Téměř ve všech strukturách jsou také funkce pro řazení dat v nich. V některých případech bude pohodlnější a efektivnější použít vyrovnávací paměti, které umožňují ukládat libovolná data a jsou ve skutečnosti jen alokovanými částmi paměti.
Objekty a zdrojePráce Game Makeru se zdroji je založena na jedinečných identifikátorech, které se používají k identifikaci konkrétní instance zdroje nebo objektu. Tyto identifikátory mohou být použity skripty nebo funkcemi k označení požadovaného zdroje. Protože vytváření zdrojů přímo v Game Makeru vyžaduje název, tento název slouží jako konstanta obsahující identifikátor zdroje. ID konkrétní instance je uloženo v lokální proměnné " id ". Při dynamickém vytváření zdrojů je vždy vrácen identifikátor vytvořeného zdroje, který lze později použít.
Zde je jednoduchý příklad skriptu, který vytiskne legendární " Ahoj, světe!" »:
show_message("Ahoj světe!");Další příklad, který zobrazuje stejný text, ale v okně programu. Všimněte si, že ve výchozím nastavení Game Maker neustále překresluje okno, takže v normálním případě by měl být tento kód umístěn v události draw.
draw_text(10, 10, "Ahoj světe!");Zde je úryvek kódu ze hry GML:
// toto je komentář /* Takto se píší komentáře v C++. */ /* definice dočasných proměnných. Tyto proměnné budou po skončení skriptu odstraněny. Všimněte si, že proměnné nevyžadují žádnou definici typu! */ var xx , yy , nn ; // Podmínka. Dá se zkrátit na "if (can_shoot)". if ( can_shoot = true ) // lze použít "=" a "==" { // Začátek bloku kódu. Můžete také napsat "začátek" jako v Pascalu. /* Nastaví proměnnou na false. Totéž lze napsat takto: "can_shoot = 0;" Protože Game Maker nerozlišuje mezi booleovskými a celočíselnými hodnotami. */ can_shoot = false ; /* Zde nastavíme nulový časovač na pět kroků. Proměnná časovače klesne na 0, a když ji dosáhne, bude vyvolána událost nulového čítače. */ alarm [ 0 ] = 5 ; /* Zde je lokální proměnná xx definována jako celé číslo A je použita funkce lengthdir_x. */ xx = x + lengthdir_x ( 14 , směr ); yy = y + lengthdir_y ( 14 , směr ); //Tato funkce vytvoří instanci obj_bullet a vrátí ID nového objektu. nn = instance_create ( xx , yy , obj_bullet ); /* Příkaz with umožňuje přímý přístup k objektovým proměnným */ s ( nn ) { rychlost = obj_tank . rychlost + 3 ; směr = obj_tank . směr ; } }Styly kódu lze kombinovat. Například předchozí příklad by mohl být zapsán takto:
var xx , yy , nn ; if can_shoot = true then begin can_shoot := falešný poplach [ 0 ] := 5 xx := x + lengthdir_x ( 14 , směr ) yy := y + lengthdir_y ( 14 , směr ) nn : = instance_create ( xx , ybuly , obj_ s nn počáteční rychlost := obj_tank . rychlost + 3 směr := obj_tank . směr konec konecZde je příklad běžného ovládání pomocí klávesnice. Funkce motion_set má dva parametry: směr (ve stupních) a rychlost (pixely na krok). Volání této funkce změní rychlost a směr vestavěných místních proměnných, které Game Maker používá k pohybu objektů (objekty lze také přesouvat přímo pomocí místní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 );A tady je příklad složitějšího scénáře pro plošinovku. S jeho pomocí může hráč chodit po konvexním povrchu:
pokud ! 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 } } jiný x -= 4