« Előző oldal- - - ^Tartalom^- - -Következő oldal »
DLL-EK HASZNÁLATA:
A 7-es változattól kezdve egy új bővítő mechanizmus van a GM-ben.
Erősen ajánlott ennek használata az ebben a fejezetben leírt függvények
helyett. A részletekért nézd át a
http://www.yoyogames.com/extensions oldalt. Ezek a függvények főleg a
régebbi verziókkal való kompatibilitás miatt maradtak.
Azokban az esetekben, amikor a GML működése
már nem elégíti ki az óhajainkat, kiterjeszthetjük a
lehetőségeket a beépülő modulok, a plug-inek
használatával. Egy beépülő modul egy DLL állomány
formájában érkezik (Dynamic Link Library - Futásidőben
Kapcsolódó Eljáráskönyvtár). Egy DLL állományban
függvényeket határozhatunk meg. Hasonló függvények
programozhatók akármelyik olyan programnyelven, amelyik
támogatja a DLL-ek létrehozását (pl. Delphi, Visual C++,
stb.). Ehhez némi programozási tapasztalat szükséges. A
beépülő függvényeknek meghatározott alakjuk van. 13
paraméterük lehet (0-12), melyek valós számok (C-ben double
típusú számok) vagy nulla végű karakterláncok lehetnek.
(Több mint 4 argumentumnál csak a valós típusú paraméterek
támogatottak jelenleg.) Visszatérniük valós számmal vagy
nulla végű szöveggel kell.
Delphiben úgy hozhatunk létre DLL-t, ha a File
menüből a New menüpontot választjuk, majd abból a
DLL-t. A következő példa egy Delphiben megírt DLL-t
tartalmaz, amely felhasználható a Game Makerben. (Ez tehát
Delphi és nem GML kód!)
Library SajatDLL;
uses SysUtils, Classes;
function SajatMin(x,y:real):real; cdecl;
begin
if x<y then Result := x else Result := y;
end;
var res : array[0..1024] of char;
function SzovegKettozes(str:PChar):PChar; cdecl;
begin
StrCopy(res,str);
StrCat(res,str);
Result := res;
end;
exports SajatMin, SzovegKettozes;
begin
end.
Ez a DLL két függvényt határoz meg: a SajatMin két
valós argumentumot kap, és a kettő minimumával tér vissza, a
SzovegKettozes pedig megkettőzi a szöveget. Legyünk
óvatosak a memóriakezeléssel. Ezért ennél a példánál
ajánlott az eredményszöveget globálisként deklarálni. A cdecl
hívási módon kívül az stdcall is használható. Ha
elkészült ez a DLL, akkor megkapjuk a SajatDLL.dll
nevű állományt, melyet abba a mappába kell elhelyezni,
ahonnan a játék fut (vagy máshová, ahol a Windows
megtalálja). Egy adatállomány is használható a DLL játékon
belüli tárolására.
Ahhoz, hogy ezt a DLL-t a GM-ben használjuk,
meg kell adni a külső függvényeket, és hogy ezekhez milyen
argumentumok tartoznak. Erre a következő függvény
használható a GML-ben:
external_define(dll,fnev,hivasmod,ertipus,argsz,arg1tipus,arg2tipus,
...) - egy külső függvény meghatározása.
Dll a DLL állomány neve, fnev
a függvény neve, hivasmod a hívási mód,
amihez a dll_cdecl vagy a dll_stdcall értékek
használhatók. Ertipus az eredmény típusa,
amihez a ty_real vagy a ty_string
használható. Argsz az argumentumok száma
(0-12). Végül minden argumentumnak részletezni kell a
típusát, ehhez ismét a ty_real vagy a ty_string
használható. Ha több, mint 4 argumentum van, akkor
mindegyiküknek ty_real típusúnak kell lennie.
Ez a függvény a külső függvény azonosítójával tér
vissza, amelyet a hívására kell használni. Így az előbbi
példa alapján a játék kezdetekor használható a következő GML
kód:
{
global.mmm=external_define('SAJATDLL.DLL','SajatMin',dll_cdecl,ty_real,2,ty_real,ty_real);
global.ddd=external_define('SAJATDLL.DLL','SzovegKettozes',dll_cdecl,ty_string,1,ty_string);
}
Ezután akárhányszor szükséges a függvények hívása,
használhatjuk a következő függvényt:
external_call(id,arg1,arg2,...) - az adott jelű
külső függvény hívása az adott argumentumokkal. Gondoskodni
kell arról, hogy a megfelelő argumentumok a megfelelő
értéket kapják. A függvény a külső függvény
eredményével tér vissza.
Így például írhatjuk a következőket:
{
aaa = external_call(global.mmm,x,y);
sss = external_call(global.ddd,'Hello');
}
Ha már nincs szükség a DLL használatára, akkor ajánlott
felszabadítani.
external_free(dll) - az adott nevű DLL
felszabadítása. Különösen szükséges, ha a játéknak el
kell távolítania a DLL-t (mert pl. egy adatállomány), ugyanis
amíg a DLL nincs felszabadítva, addig eltávolítani sem lehet.
A legjobb ezt pl. a játék vége eseménynél megtenni.
Hogyan csinálhat valamit egy DLL-ben lévő függvény a
játékban? Tegyük fel, hogy létre akarunk hozni egy olyan
DLL-t, ami objektumok példányait adja hozzá a játékhoz. A
legegyszerűbb, ha lehetővé tesszük a DLL függvénynek, hogy GML
kódot tartalmazó szöveggel térjen vissza. A GML
kódot tartalmazó szöveg végrehajtható a következő GML
függvénnyel:
execute_string(sz) - az sz
szövegben lévő kóddarab végrehajtása.
DLL-lel parancsállomány is létrehozható, amit majd később
végre lehet hajtani (ez a függvény arra is használható, hogy
később a játék viselkedését meg lehessen változtatni).
execute_file(fnev) - az állományban
található kóddarab végrehajtása.
Most hívható egy külső függvény, és végrehajtható az
eredményül adott szöveg, pl.:
{
ccc = external_call(global.ddd,x,y);
execute_string(ccc);
}
Kivételes esetekben szükséges lehet, hogy a DLL tudja kezelni
a játék fő grafikus ablakát. Ez elérhető a következő
függvénnyel, és aztán átadható a DLL-nek:
window_handle() - a fő ablak kezelésével tér
vissza.
Fontos tudni, hogy a DLL-ek nem használhatók védett módban.
A külső DLL-ek használata rendkívül erőteljes funkció.
Csak akkor használjuk, ha tudjuk, hogy mit teszünk.
« Előző oldal- - - ^Tartalom^- - -Következő oldal »