DLL-kirjastojen käyttäminen

Nämä toiminnot ovat käytettävissä vain Game Makerin Pro-versiossa.

Huomaa, että versiosta 7 lähtien Game Makerissa on uusi laajennusmekanismi. On erittäin suositeltavaa, että käytät tätä uutta laajennusmekanismia tässä osiossa esiteltyjen funktioiden sijaan. Katso lisätietoja seuraavalta sivulta: http://www.yoyogames.com/extensions (englanninkielinen). Nämä funktiot on jätetty lähinnä aiempien versioiden yhteensopivuuden takia.

Silloin, kun GML ei enää riitä toteuttamaan haluamaasi, voit laajentaa mahdollisuuksia käyttämällä lisäosia. Lisäosat ovat muodoltaan DLL-tiedostoja (Dynamic Link Library, dynaaminen linkkikirjasto). DLL-tiedostossa voidaan määrittää funktioita, jotka voidaan ohjelmoida millä tahansa DLL-kirjastojen luomista tukevalla ohjelmointikielellä (esim. Delphi, C, C++, jne.). Niiden tekemiseen tarvitaan tosin ohjelmointitaitoja. Lisäfunktioiden on noudatettava tietynlaista muotoa. Niillä voi olla 0-16 argumenttia, joista jokainen voi olla joko reaaliluku (C:ssä tietotyyppi double) tai null-katkaisumerkkiin päättyvä merkkijono. (Jos argumentteja on enemmän kuin neljä, tällä hetkellä kaikkien argumenttien on tällöin oltava reaalilukutyyppisiä.) Funktioiden on palautettava joko reaaliluku tai null-katkaisumerkkiin päättyvä merkkijono.

Delphissä DLL luodaan valitsemalla ensin File-valikosta New ja valitsemalla sitten DLL. Tässä on esimerkki Delphillä kirjoitetusta DLL:stä, jota voit käyttää Game Makerin kanssa. (Huomaa, että tämä on Delphi-koodia, ei GML-koodia!)

library MyDLL;

uses SysUtils, Classes;

function MyMin(x,y:double):double;  cdecl;
begin
  if x<y then Result := x else Result := y;
end;

var res : array[0..1024] of char;

function DoubleString(str:PChar):PChar; cdecl;
begin
  StrCopy(res,str);
  StrCat(res,str);
  Result := res;
end;

exports MyMin, DoubleString;

begin
end.

Tämä DLL määrittelee kaksi funktiota: MyMin, joka ottaa kaksi reaalilukuargumenttia ja palauttaa niistä pienemmän, sekä DoubleString, joka kaksinkertaistaa merkkijonon. Muistinkäsittelyn kanssa on oltava varuillaan. Siksi palautuva merkkijono on asetettu globaaliksi. Huomaa myös cdecl-kutsumistapa. Voit käyttää joko cdecl tai stdcall -kutsumistapaa. Kun teet DLL-tiedoston Delphillä, syntyvän tiedoston nimi on MyDLL.DLL. Tämä tiedosto on sijoitettava pelin suoritushakemistoon (tai muuhun paikkaan, mistä Windows löytää sen).

Käyttääksesi tätä DLL:ää Game Makerissa tulee ensin määrittää ulkoiset funktiot, joita haluat käyttää, sekä se, minkätyyppisiä argumentteja ne ottavat. Tätä varten GML:ssä on olemassa seuraava funktio:

external_define(dll,name,calltype,restype,argnumb,arg1type,arg2type, ...) Määrittää ulkoisen funktion. dll on dll-tiedoston nimi. name on funktion nimi. calltype on käytettävä kutsumistapa. Aseta sen arvoksi joko dll_cdecl tai dll_stdcall. restype on palautuksen tyyppi. Aseta sen arvoksi joko ty_real tai ty_string. argnumb on argumenttien lukumäärä (0-16). Seuraavaksi sinun on määriteltävä jokaiselle argumentille sen tyyppi. Aseta sen arvoksi jälleen joko ty_real tai ty_string. Kun funktiolla on enemmän kuin neljä argumenttia, kaikkien niistä on oltava tyyppiä ty_real.

Tämä funktio palauttaa ulkoisen funktion id:n, jota on käytettävä sen kutsumiseen. Yllä annetussa esimerkissä käyttäisit siis pelin alussa seuraavaa GML-koodia:

{
  global.mmm = external_define('MyDLL.DLL','MyMin',dll_cdecl,
                                     ty_real,2,ty_real,ty_real);
  global.ddd = external_define('MyDLL.DLL','DoubleString',dll_cdecl,
                                     ty_string,1,ty_string);
}

Kun haluat kutsua näitä funktioita, käytä seuraavaa funktiota:

external_call(id,arg1,arg2,...) Kutsuu ulkoista funktiota annetulla id:llä ja annetuilla argumenteilla. Oikeantyyppisiä (reaaliluku tai merkkijono) argumentteja on annettava oikea määrä. Funktio palauttaa ulkoisen funktion tuloksen.

Voit siis esimerkiksi kirjoittaa:

{
  aaa = external_call(global.mmm,x,y);
  sss = external_call(global.ddd,'Hello');
}

Kun et enää tarvitse DLL:ää, vapauta se.

external_free(dll) Vapauttaa annetun indeksin mukaisen DLL:n. Tämä on erityisen tärkeää, jos pelin tulisi poistaa DLL-tiedosto. Niin kauan kuin DLL:ää ei ole vapautettu, sitä ei voida poistaa. Tämä on parasta tehdä esim. pelin lopputapahtumassa.

Saatat ihmetellä, miten DLL:ään tehdään funktio, joka vaikuttaa jotenkin pelin kulkuun. Haluat ehkä esimerkiksi luoda DLL:n, joka lisää objektien instansseja peliisi. Helpoin tapa on määrittää DLL-funktion ulostuloarvoksi merkkijono, joka sisältää GML-koodinpätkän. Tämä merkkijono, joka sisältää GML-koodia, voidaan suorittaa käyttämällä seuraavaa GML-funktiota:

execute_string(str,arg0,arg1,...) Suorittaa str-merkkijonon koodin annetuilla argumenteilla.

Vaihtoehtoisesti voit määrittää DLL:n luomaan skriptin sisältävän tiedoston. Tämä skripti voidaan suorittaa seuraavan funktion avulla (tätä funktiota voidaan käyttää myös pelin toiminnan myöhempään muunteluun):

execute_file(fname) Suorittaa koodinpätkän annetusta tiedostosta.

Voit nyt kutsua ulkoista funktiota ja sitten suorittaa palautuvan merkkijonon esim. seuraavasti:

{
  ccc = external_call(global.ddd,x,y);
  execute_string(ccc);
}

Joissain harvoissa tapauksissa voi olla tarpeen välittää DLL-tiedostolle pelin ikkunan kahvan tunnus. Tämä saadaan selville seuraavalla funktiolla ja voidaan sitten välittää DLL:lle:

window_handle() Palauttaa pääikkunan kahvan tunnuksen.

Huomaa, että DLL:iä ei voi käyttää turvatussa tilassa (Secure mode).

Ulkoisten DLL:ien käyttö on erittäin tehokas mekanismi. Käytä niitä kuitenkin vain, jos tiedät, mitä olet tekemässä.