Tutorial - Dlls und der GameMaker

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Tutorial - Dlls und der GameMaker

      Dieses Tutorial beschreibt primär wie man mit dll's auf der GM seite umgeht!

      Die schönere PDF gibt es hier !

      Bestimmt hat sich jeder von euch schon mal über die Einschränkungen vom Game Maker geärgert. Entweder der GM hat eine zu schlechte Performance, oder es gibt die gewünschte Funktion erst gar nicht. Da helfen DLL’s! Dieses Tutorial ist an alle gerichtet, die sich schon Kenntnisse zu geeigneten sprachen haben, aber nur noch Probleme damit haben diese skills für eine DLL zu nutzen.

      Die Beispiel DLL
      Hier werde ich jetzt ganz schnell eine kleine DLL in c++ schreiben. Sie soll uns die Hypotenuse von einem Dreieck berechnen… natürlich nichts was der GM nicht kann, doch ich will jetzt nichts Großes aus dem Part vom Tutorial machen, denn darüber könnte man ganze Bücher schreiben.
      Also, als erstes erstellen wir einen Ordner, da viele Dateien entstehen wenn man so eine DLL machen will. Nachdem wir das gemacht haben, starten wir Dev-C++ und machen ein neues Projekt unter Datei->Neu->Projekt. Da wählen wir dann DLL aus und nennen diese Pythagoras. Danach taucht ein speicherdialog auf und ihr wählt den Ordner den wir gerade erstellt haben.
      Jetzt seht ihr den Code von der dll.h. Unter den ganzen Symbolleisten in Dev-C++ seht ihr dann noch einen anderen Tab, das ist die dllmain.cpp.
      Als erstes müssen wir die dll.h nach unsern Wünschen präparieren. Wir schreiben folgenden Code gleich nach der ersten Zeile:
      #define export extern “C“ __declspec (dllexport)
      Danach können wir die dll.h speichern.
      Weiter geht’s mit der dllmain.cpp.
      Dort löschen wir erst mal alles, was unter
      #include
      steht!
      Jetzt fügen wir noch ein
      #include
      ein. Für alle die es nicht wissen: windows.h und math.h, die sogenannten headerfiles, würde man im GM eine Art Extension nennen. Die math.h wird mitgenommen, weil sie die Funktion hypot() mitbringt, die wir später noch brauchen.
      So, weiter im Text!
      Jetzt kommt die eigentliche Funktion der DLL. Wir schreiben jetzt folgendes:

      Quellcode

      1. export double pyth(double a, double b)
      2. {
      3. return(double)hypot(a,b);
      4. }

      Hier finden wir auch wieder die Funktion hypot() wieder. Diese hat 2 Argumente, a und b, also die zwei Katheten.
      Jetzt sind wir bereit eine Dll draus zu machen. Einfach dazu den Kompilieren Knopf in der Symbolleiste oder Ctrl+F9 drücken! Wenn es jetzt keine Fehler gibt, dann haben wir schon mal die dll die wir für dieses Beispiel nutzen wollen.

      Der GM Part
      Wir erstellen einen neue gmk und legen erst mal 3 Scripte an. Das erste nennen wir pyth_init, die zweite pyth_calc und die dritte pyth_free.
      Die pyth_init benutzen wir, um die Dll zu initialisieren. Was nichts anderes heißt als sie in den RAM zu legen, damit der GM sie nutzen kann. Deshalb ist die pyth_free auch besonders wichtig, dazu aber später.
      In der pyth_init laden wir wie schon gesagt die DLL.

      GML-Quellcode

      1. global.pyth=external_define(“Pythagoras.dll”,”pyth”,dll_stdcall,ty_real,2,ty_real,ty_real);

      Also: external_define(dll,name,calltype,restype,argnumb,arg1type,arg2type, ...)

      Das erste Argument ist wohl noch das einfachste: der Pfad zur DLL.
      Name: der Name der Funktion. Wir haben sie ja „pyth“ genannt.
      Calltype wird schon einiges schwieriger: Es setzt die Art der Konvention fest. Es wir eigentlich immer dll_stdcall genutzt.
      restype ist der Typ des Rückgabewerts(ty_real oder ty_string).
      argnumb ist die Anzahl der Argumente (0-11). Wir haben 2.
      Als letztes müssen wir für jedes Argument den Typ festlegen (wieder ty_real oder ty_string). Sind es mehr als 4 Argument, dann müssen diese alle vom Typ ty_real sein.


      Als nächstes nehmen wir uns die pyth_calc vor. Dies ist die Funktion, die man benutzt um zu rechen.

      GML-Quellcode

      1. external_call(global.pyth,argument0,argument1);

      Im Gegensatz zu Scripten die wir gewohnt sind, brauchen wir hier kein Return.

      Also: external_call(id,arg1,arg2,...)

      Das erste Argument ist die id. Die haben wir von der external_define bekommen.
      arg1, arg2.. sind die Argumente die wir der dll übergeben.

      Die letzte Funktion: pyth_free
      Auch wenn diese Funktion nicht sonderlich wichtig aussieht, ist sie es. Wie wir ja wissen, liegt die dll ja im RAM. Wenn wir jetzt das Spiel beenden würden, würde die dll da immer noch liegen und schön viel Platz verbrachen. Um die Dll aus dem RAM zu entfernen, brauchen wir die Funktion

      GML-Quellcode

      1. external_free("Pythagoras.dll");

      So, jetzt noch was repräsentables im GM machen, immer dran denken die dll im selben Ordner wie das Spiel zu haben und es kann nichts schief gehen.

      Anhänge:
      Alles.zip (enthält dev-C++ projektdateien, dll, gmk und eine PDF)
      Gm_dll.pdf (das tut als pdf)
      Bevor hier die Hölle los ist: Ich binn jetzt auch nicht der Experte auserhalb von GM. Falls vorhanden bitte alle Fehler melden, würdet mir und den die das lesen einen großen gefallen machen! ;)

      In dem Sinne:
      MfG SDX

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von SDX () aus folgendem Grund: Dll, tutorial, howto