Game Maker Language

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt hozzászólók, és jelentősen eltérhet a 2016. június 15-én felülvizsgált verziótól ; az ellenőrzések 6 szerkesztést igényelnek .
Game Maker Language
Nyelvóra objektum-orientált , esemény-orientált , szkriptelt
Megjelent 1999
Szerző Marcus Overmars
Fejlesztő Overmars, Markus Hendrik
Fájlkiterjesztés _ .gml , .gmk , .gm6 , .gmd , .gm8 , .gm81
Befolyásolt C++
Weboldal yoyogames.com
OS Microsoft Windows

A Game Maker Language (GML)  egy értelmezett programozási nyelv, amelyet a Game Maker nevű számítógépes játékfejlesztő programmal való használatra terveztek . A nyelvi támogatást eredetileg Mark Overmars vezette be a Game Makerbe , hogy kiegészítse a gombesemény-rendszert, később azonban minden gombesemény bekerült a GML-be, lehetővé téve a programozó számára, hogy elkerülje a gombfunkciók használatát. A GML nagyon szorosan kapcsolódik a Game Maker környezethez. A Game Maker úgy lett kialakítva, hogy kiküszöbölje az olyan dolgok manuális programozásának szükségességét, mint az eseménykezelés, a szinttervezés és az objektumbeállítás. Van egy tévhit, hogy a GML támogatja a kódrészletek beszúrását más nyelveken, például Pascal , Assembler vagy C++ nyelveken . A tévhit a GML szintaxis és a Pascal és a C ++ részleges hasonlósága miatt merült fel. (Például az "&&" operátor helyettesíthető "és"-re).

Könyvtárak

A Game Makerben a gombesemények gyűjteménye alkot egy könyvtárat. A program felületén a könyvtárak különböző esemény ikonokat tartalmazó könyvjelzőként jelennek meg. Minden ilyen esemény egy GML- szkript vagy függvény, amelyet a felhasználó használhat a játékban. A Game Maker számos szabványos könyvtárat tartalmaz, amelyek a legtöbb játékban használt fő eseményeket tartalmazzák. Lehetőség van saját könyvtárak létrehozására is a Library Maker segítségével . A GMS2 beépített mechanizmussal rendelkezik a gombműveletek GML-kóddá konvertálására és fordítva, amely lehetővé teszi a kezdők számára, hogy gyorsan váltsanak GML-re, és jobban megértsék a szabványos műveletek működését.

A GML szintaxisa és szemantikája

A GML szerkezetileg hasonló egy nyelvhez, kódblokkokkal , függvényhívásokkal, változó-hozzárendelésekkel, operátor szintaxissal stb. A GML különbséget tesz az utasítások és kifejezések között. Például,

g < 1;

nem érvényes állítás, és hibát fog okozni. Ezenkívül a változó-hozzárendelés mindig operátor, ezért nem használható kifejezésekben. Például a következő sor mindig hibát generál, mert a beágyazott kifejezést igazra vagy hamisra értékeli, majd összehasonlítja a logikai eredményt az "Igen" karakterlánccal (helytelen összehasonlítás):

if ((válasz = get_string("Igen vagy Nem?", "")) == "Igen")

Érdemes megjegyezni, hogy az "=" egyenlőségjel egy hozzárendelési operátor és egy logikai összehasonlító operátor a kifejezésekben, míg a C ++-ban a "==" kettős jelet írják a kifejezésekbe. A "==" kettős egyenlőségjelet azonban a rendszer helyesen értelmezi, ha kifejezésekben használjuk. Egy ilyen karakter hozzárendelési operátorként való használata futásidejű hibát okoz. A GML támogatja a növekményes operátorokat is :

g++; // a postfix és az előtag jelölése egyaránt támogatott

és

g += 1;

ugyanaz, mint a

g = g + 1;

Vannak operátorok is: -=, *=, /=, |=, &= és ^=. A GMS2-től kezdve bevezették a hármas operátor ?: támogatását . A GML-ben az operátorokat pontosvesszővel lehet elválasztani, de ez nem kötelező (bár ez bizonyos esetekben hibához vezethet).

Funkciók

A Game Maker beépített funkciók széles körű könyvtárát tartalmazza az alapvető funkciók biztosításához. A programozó elkészítheti saját szkriptjeit, amelyeket pontosan ugyanúgy hívnak meg, mint a függvényeket. A Game Maker rajzolási funkciói a Direct3D API -t használják . Szükség esetén a Game Maker lehetővé teszi a platform natív kódjának hívását is kiterjesztéseken keresztül (DLL Windowson, Java Androidon, JS HTML5-ön stb.).

Változók

Általában a GML-nek nem kell előre deklarálnia egy változót, ahogyan azt néhány más nyelv is megteszi. A változó automatikusan létrejön, közvetlenül azután, hogy értéket ad hozzá:

foo="bár";

A Game Maker számos beépített változóval és állandóval rendelkezik . Minden objektumpéldány sok helyi változót tartalmaz, például "x" és "y". Számos beépített globális változó is létezik, mint például a "score". Ezek a változók az objektumpéldányoktól függetlenül léteznek. Ezek a változók nem tartalmazzák a " globális ." előtagot, ellentétben a programozó által megadott globális változókkal. Az egydimenziós és kétdimenziós tömbök is támogatottak.

Adatstruktúrák

A GML hatféle adatszerkezet létrehozására és szerkesztésére alkalmas funkciókkal rendelkezik : verem , sor , lista , leképezés (asszociatív tömb), prioritási sor és rács. A rács, a lista és a térkép a tömbszerű szintaxist biztosító accessorokon keresztül is elérhető:

var érték = lista[| 0]; // a ds_list_find_value(list, 0) helyett térkép[? "name"] = "Felhasználónév"; // a ds_map_add(map, "name", "Felhasználónév" helyett) var érték = térkép[? "név"]; // a ds_map_find_value(map, "name") helyett;

Típusok

A GML a következő adattípusokat támogatja:

Változók köre

Míg a GML -t objektum-orientált nyelvnek tekinthetjük, a Game Maker objektumainak és objektumpéldányainak természete jelentős különbségeket hoz létre a változók elhatárolásában. A lokalitásnak két típusa van: lokalitás egy objektumban és lokalitás egy szkriptben (vagy más kódrészletben, amely egy külön tárolóban található). Az a tény, hogy egy változó lokális egy objektum példányára, azt jelenti, hogy a változó az objektum egy adott példányához van kötve, és csak azon a példányon kívülről használható az adott példányt meghatározó előtaggal; az a tény, hogy egy változó lokális egy szkriptben, azt jelenti, hogy a változó csak abban a szkriptben használható (és megsemmisül, amikor a szkript véget ér). Ezentúl a "helyi" kifejezés egy objektumban lokalitást jelent. Alapértelmezés szerint a változó helyi az objektumhoz, de nem helyi ahhoz a szkripthez, amelyben használják. Annak érdekében, hogy egy változó minden objektumpéldány számára elérhető legyen, a globális névtéren keresztül definiálható :

global .foo = "sáv";

Lehetőség van globális változók deklarálására is a globalvar kulcsszó használatával :

globalvar foo, bar;

Ez a módszer azonban kerülendő, mert könnyen vezethet nehezen észlelhető hibákhoz a változó hatókörök metszéspontja miatt (ugyanezt maguk a GMS fejlesztők is javasolják, sőt elképzelhető, hogy a jövőben ez a kulcsszó lesz teljesen eltávolítva a nyelvből – jelenleg csak a visszamenőleges kompatibilitás miatt maradt meg). Ahhoz, hogy egy változó lokális legyen egy szkriptben, a következőképpen kell meghatározni:

var foo, bár;

A helyi változó hatóköre az a szkript, amelyen belül deklarálva van. Ez azt jelenti, hogy továbbra is elérhető lesz kontextuskapcsolón (a billentyűvel együtt ). Például:

var foo = "bár"; másokkal _ { show_message(foo); // a foo változó elérhető }

Az objektum helyi változói az objektum példányazonosítójának előtagként történő használatával érhetők el

instance.varname

azonban ilyen módon nem lehet egyik szkript lokális változóit a másikból lekérni, hacsak nem adjuk át függvényparaméterként. Egy objektum aktuális névterét a " with " konstrukcióval lehet megváltoztatni. Például a következő szkript, ha ütközési eseménybe kerül, megsemmisíti az eseményben érintett objektum másik példányát (vegye figyelembe, hogy az ütközési eseménynél a Game Maker automatikusan beállítja az other változót az objektum második példányára ütközött):

másokkal _ { instance_destroy(); }

Memóriakiosztás

A GML automatikusan lefoglalja a memóriát a változókhoz menet közben, és dinamikus típusokat használ , így különböző típusú értékek hozzárendelése is lehetséges a változókhoz. Például először létrehozhat egy egész változót, majd megváltoztathatja azt karakterláncra:

intSzám = 1; intNumber = "Ez a változó most egy karakterláncot tartalmaz";

A GML-ben nincs olyan speciális funkcionalitás, amely lehetővé teszi a változó által elfoglalt memória felszabadítását, azonban szükség esetén új, kisebb értéket rendelhet a változóhoz. Például, ha van egy változója, amely nagy szöveget tárol, a változó üres karakterláncra állítása memóriát szabadíthat fel. Ugyanez vonatkozik a tömbökre is:

adatok = [1, 2, 3, 4, 5]; // létrehozott egy tömböt (ez a szintaxis a tömbök létrehozásához a GMS2 óta elérhető) adat = 0; // megsemmisítette a tömböt (ez most csak egy változó)

Amikor egy objektumot megsemmisítenek, az összes lokális változó is megsemmisül, és minden globális változó tőlük függetlenül létezik. Ezért előnyben kell részesíteni a lokális változókat, és csak akkor szabad globális változókat használni, ha valóban szükséges. A nagy mennyiségű információ hatékonyabb tárolása érdekében a Game Maker számos adatstruktúrát támogat, mint például a verem, a sor, a lista, a térkép, a prioritási sor és a rács. Ezeket a struktúrákat a beépített függvények hozzák létre, módosítják és semmisítik meg. Szinte minden struktúrában megtalálhatók az adatok rendezésére szolgáló függvények is. Egyes esetekben kényelmesebb és hatékonyabb lesz olyan pufferek használata, amelyek lehetővé teszik tetszőleges adatok tárolását, és valójában csak lefoglalt memóriadarabok.

Objektumok és erőforrások

A Game Maker erőforrásokkal végzett munkája egyedi azonosítókon alapul, amelyek egy adott erőforrás vagy objektumpéldány azonosítására szolgálnak. Ezeket az azonosítókat szkriptek vagy függvények használhatják a szükséges erőforrás jelzésére. Mivel az erőforrások közvetlen létrehozásához a Game Makerben névre van szükség, ez a név az erőforrás-azonosítót tartalmazó konstansként szolgál. Egy adott példány azonosítója az „ id ” helyi változóban tárolódik. Az erőforrások dinamikus létrehozása során mindig a létrehozott erőforrás azonosítója kerül visszaadásra, amely később felhasználható.

Szkriptpéldák

Íme egy egyszerű forgatókönyv-példa, amely kinyomtatja a legendás " Hello, World!" »:

show_message("Helló világ!");

Egy másik példa, amely ugyanazt a szöveget jeleníti meg, de a program ablakában. Ne feledje, hogy alapértelmezés szerint a Game Maker folyamatosan újrarajzolja az ablakot, így normál esetben ezt a kódot a sorsolási eseményben kell elhelyezni.

draw_text(10, 10, "Helló, Világ!");

Íme egy kódrészlet a GML játékból:

// ez egy megjegyzés /* C++-ban így íródnak a megjegyzések. */ /* ideiglenes változók meghatározása. Ezek a változók a szkript vége után törlődnek. Vegye figyelembe, hogy a változókhoz nincs szükség típusdefinícióra! */ var xx , yy , nn ; // Állapot. Lerövidíthető "if (can_shoot)"-ra. if ( can_shoot = true ) // "=" és "==" használható { // Kódblokk eleje. A „begin”-t is írhatja, mint a Pascalban. /* Állítsa be a változót false értékre. Ugyanez így írható: "can_shoot = 0;" Mivel a Game Maker nem tesz különbséget a logikai és az egész értékek között. */ can_shoot = false ; /* Itt nulla időzítőt állítunk be öt lépésre. Az időzítő változó 0-ra csökken, és amikor eléri, a Zero Counter Event meghívásra kerül. */ riasztás [ 0 ] = 5 ; /* Itt az xx helyi változót egész számként definiáljuk, ÉS a longdir_x függvényt használjuk. */ xx = x + longdir_x ( 14 , irány ); yy = y + longdir_y ( 14 , irány ); //Ez a függvény létrehozza az obj_bullet példányát, és visszaadja az új objektum azonosítóját. nn = példány_létrehozása ( xx , yy , obj_bullet ); /* A with utasítás lehetővé teszi az objektumváltozók közvetlen elérését */ ( nn ) _ { sebesség = obj_tank . sebesség + 3 ; irány = obj_tank . irány ; } }

A kódstílusok keverhetők. Például az előző példa így írható:

var xx , yy , nn ; if can_shoot = true then begin can_shoot := hamis riasztás [ 0 ] := 5 xx := x + longdir_x ( 14 , irány ) yy := y + longdir_y ( 14 , irány ) nn := példány_létrehozása ( xx , yy , obj_bullet ) nn kezdő sebességgel : = obj_tank . sebesség + 3 irány := obj_tank . irány vége vége

Íme egy példa egy normál billentyűzetvezérlésre. A motion_set függvény két paramétert vesz fel: irányt (fokban) és sebességet (képpont lépésenként). Ennek a függvénynek a meghívása megváltoztatja a beépített helyi változók sebességét és irányát, amelyet a Game Maker az objektumok mozgatására használ (az objektumok közvetlenül is mozgathatók az x és y helyi változókkal):

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

És itt van egy példa egy összetettebb forgatókönyvre egy platformjátékhoz. Használatával a játékos domború felületen járhat:

ha ! hely_mentes ( 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 } } más x -= 4

Kritika

A GML laza szintaxisa bizonyos mértékig megkönnyíti a játékok létrehozását, de teljesen olvashatatlan kódot generálhat: 0 kapcsoló kezdő eset 0 : x = 0 szünet } if a = 0 akkor kezdődik b = 1 } else if a == 0 { b := 1 end Bár nem része a nyelvnek, egy másik gyakori kritika a Game Maker régebbi verzióival szemben az EXE-fájlok létrehozásának folyamata volt, amelyek betöltőből és GM-fájlforrásokból állnak. Egy ilyen játék indításakor a kódot egy absztrakt szintaxisfába elemezzük (kódértelmezést alkalmaztunk), ami megkönnyítette a dekompilációt és jelentősen megnövelte a betöltési időt. A modernebb verziókban (GameMaker: Studio) azonban megváltoztak a mechanizmusok, így nincs probléma sem az indítási sebességgel, sem a dekompilációval (GMS-hez nincs visszafordító).

Irodalom

  • Matthew DeLucas. GameMaker Játékprogramozás GML-lel. - Csomag, 2014. - 350 p. — ISBN 978-1-78355-944-2 .

Lásd még

Linkek