« 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 »