Jazyk Game Makeru

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 15. června 2016; kontroly vyžadují 6 úprav .
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“).

Knihovny

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.

Syntaxe a sémantika GML

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 prefixu

a

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ě).

Funkce

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.).

Proměnné

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 .

Datové struktury

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");

Typy

GML podporuje následující typy dat:

Rozsah proměnných

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.varname

tí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(); }

Alokace paměti

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 zdroje

Prá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.

Příklady skriptů

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 konec

Zde 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

Kritika

Volná syntaxe GML do určité míry usnadňuje vytváření her, ale může generovat zcela nečitelný kód: přepínač 0 začátek případ 0 : x = 0 přerušení } pokud a = 0 pak začátek b = 1 } jinak pokud a == 0 { b := 1 konec Ačkoli to není součástí jazyka, další běžnou kritikou starších verzí Game Makeru byl proces vytváření souborů EXE, které se skládají z nakladače a zdrojů souborů GM. Při spuštění takové hry je kód analyzován do abstraktního syntaktického stromu (byla použita interpretace kódu), což usnadnilo dekompilaci a výrazně prodloužilo dobu načítání. V modernějších verzích (GameMaker: Studio) však byly mechanismy změněny, takže nejsou problémy ani s rychlostí spouštění, ani s dekompilací (neexistují dekompilátory pro GMS).

Literatura

  • Matthew DeLucas. GameMaker programování her s GML. - Packt, 2014. - 350 s. — ISBN 978-1-78355-944-2 .

Viz také

Odkazy