Ihr wisst bestimmt, dass man mit der 39dll Multiplayerspiele machen kann. Doch wie geht das eigentlich genau?
Ganz am Anfang müsst ihr die Scripts über "Scripts" --> "Import Scripts" --> "DllScripts.gml" laden. Jetzt macht ihr am besten ein Objekt, das im Game Start - Event die dll initialisiert:
Hier ist das Argument0 der Dateinamen der dll. Ist dieser auf 0, wird automatisch die "39dll.dll" gewählt. Wenn man die dll aber umbenannt hat (z.B. in "beispiel.dll"), so muss man als Argument0 "beispiel.dll" schreiben. Das Argument1 stellt ein, ob die Socket-Funktionen genutzt werden sollen, oder nicht und das Dritte (Argument2), um die Utility-Scripts zu gebrauchen.
Natürlich müsst ihr dazu die 39dll.dll im selben Ordner, wie die gm6 -, gmk - oder exe - Datei haben!
Die Grundlagen stehen jetzt! Nun muss die Verbindung her. Diese erstellt man, indem ein Spieler das Spiel created (also erstellt) und der Andere / die Anderen das erstellte Spiel joinen (also mitspielen).
Dazu macht ihr ein Create - und ein Join - Objekt, welche ein Sprite mit dem "Create" und "Join" Button haben. In den Create-Button kommt in den Left Pressed - Event
und in den Join-Button
Alles anzeigen
Zur erklärung:
Die Variable global.master ist sozusagen der Chef des Spiels. Wenn diese auf true steht, dann ist man der Leiter des Spiels. Diese Variable benützt man, um die Player zu unterscheiden. So kann man zum Beispiel sagen, dass der global.master das Spiel beginnt usw.
Im Join-Button wird auch zuerst global.master definiert. Danach wird die IP-Adresse des Creators abgefragt, damit man das von ihm erstellte Spiel joinen kann. Hier ist "127.0.0.1" schon eingestellt, weil man sich damit mit sich selber verbindet (Um das Spiel zu testen). Nun wird noch abgefragt, ob der Creator schon created hat bzw schon im Warteraum ist. Wenn ja kommen beide Spieler in den Spielraum.
Jedoch muss im Warteraum auch noch einen Code hin! Erstelle dazu ein obj_warten mit folgendem Code im Create-Event:
und dem hier im Step-Event:
Das Create -, das Join - und das dllinit-Objekt kommen nun in einen Raum (z.B. room_verbindung), während das obj_warten in den room_warten kommt.
Zum Test wird auch ein room_game gebraucht!
So! Das Erste wäre mal geschafft: Die Verbindung steht!
Nun müssen die Spieler aber miteinander kommunizieren können (d.h. Variablen miteinander austauschen).
Zuerst mal die Grundlagen:
Es gibt zum Senden der Variablen diese Befehle (In diesem Beispiel im Keyboard Right - Event des obj_spieler):
Alles anzeigen
Und zum Empfangen diese hier (Kommt in den Step - Event des obj_control):
Alles anzeigen
Sieht vielleicht schwer aus, ist es aber nicht!
Im ersten Code wird die Variable x des obj_spieler mit dem Drücken der rechten Pfeiltaste um 2 erhöht und gleich danach wird der neue Wert der Variable x an den Gegner übertragen.
clearbuffer() löscht den Buffer (muss immer vorhanden sein!)
writebyte(0) sagt, mit welcher Variable das Ganze gesendet/empfangen werden soll. Ist diese 0, muss sie beim Empfangen der Variable auch 0 sein. Sie ist sozusagen die Kennungsvariable, damit wenn zwei Variablen gleichzeitig gesendet werden, nicht beide als x-Variable gesehen werden.
writeshort(x) sendet die Variable x. Wenn man aber einen String senden will, muss man writestring(...) schreiben (in diesem Beispiel writestring(global.spielername))!
sendmessage(global.otherplayer) sendet diese Nachricht dem Gegner.
Im zweiten Code, also im Empfang wird zuerst abgecheckt, ob der Gegner noch da ist. Wenn nein wird eine Nachricht angezeigt, dass der Mitspieler das Spiel verlassen hat. Wenn dies jedoch nicht der Fall ist, wird die messageid auf readbyte(); eingestellt. Nun kommen also wieder diese Kenungs-Variablen zum Zuge.
"case 0:" fragt ab, ob diese Variable 0 ist. Wenn ja wird die Variable newx auf die gelesene Variable (also die gesendete x-Position des Gegners) gestellt, wobei readshort() Variablen und readstring() Strings liest!
Nun bekommt das Gegner-Objekt (obj_gegner) diese Empfangene Variable als x-Wert zgeteilt.
So kann man also Variablen miteinander austauschen. Hier muss, wie gesagt immer beachtet werden, dass die Kennungs-Variablen miteinander übereinstimmen!
Um eine bessere Verbindung zu ermöglichen, sollte man noch ein obj_setnagle mit folgendem Code im Create - Event erstellen:
Hier muss als Argument0 die ID des Sockets haben, den du beschleunigen willst. Argument1 stellt dann ein, ob er beschleunigt werden soll, oder nicht.
Um die dll wieder zu entladen sollte man in einem Objekt im Game End - Event noch den Code
einfügen. Sonst werden noch kleine Dateien auf dem PC gespeichert, was allerdings nicht schlimm ist.
Ich habe hier ein sehr kleines Example in Form eines Chats gemacht, damit ihr das Ganze noch praktisch sehen könnt! Zum Downloaden HIER klicken!
Ich hoffe, das Tutorial hat euch geholfen! Bei Fragen bitte hier reinschreiben.
MfG flogy
Ganz am Anfang müsst ihr die Scripts über "Scripts" --> "Import Scripts" --> "DllScripts.gml" laden. Jetzt macht ihr am besten ein Objekt, das im Game Start - Event die dll initialisiert:
Hier ist das Argument0 der Dateinamen der dll. Ist dieser auf 0, wird automatisch die "39dll.dll" gewählt. Wenn man die dll aber umbenannt hat (z.B. in "beispiel.dll"), so muss man als Argument0 "beispiel.dll" schreiben. Das Argument1 stellt ein, ob die Socket-Funktionen genutzt werden sollen, oder nicht und das Dritte (Argument2), um die Utility-Scripts zu gebrauchen.
Natürlich müsst ihr dazu die 39dll.dll im selben Ordner, wie die gm6 -, gmk - oder exe - Datei haben!
Die Grundlagen stehen jetzt! Nun muss die Verbindung her. Diese erstellt man, indem ein Spieler das Spiel created (also erstellt) und der Andere / die Anderen das erstellte Spiel joinen (also mitspielen).
Dazu macht ihr ein Create - und ein Join - Objekt, welche ein Sprite mit dem "Create" und "Join" Button haben. In den Create-Button kommt in den Left Pressed - Event
und in den Join-Button
GML-Quellcode
Zur erklärung:
Die Variable global.master ist sozusagen der Chef des Spiels. Wenn diese auf true steht, dann ist man der Leiter des Spiels. Diese Variable benützt man, um die Player zu unterscheiden. So kann man zum Beispiel sagen, dass der global.master das Spiel beginnt usw.
Im Join-Button wird auch zuerst global.master definiert. Danach wird die IP-Adresse des Creators abgefragt, damit man das von ihm erstellte Spiel joinen kann. Hier ist "127.0.0.1" schon eingestellt, weil man sich damit mit sich selber verbindet (Um das Spiel zu testen). Nun wird noch abgefragt, ob der Creator schon created hat bzw schon im Warteraum ist. Wenn ja kommen beide Spieler in den Spielraum.
Jedoch muss im Warteraum auch noch einen Code hin! Erstelle dazu ein obj_warten mit folgendem Code im Create-Event:
und dem hier im Step-Event:
Das Create -, das Join - und das dllinit-Objekt kommen nun in einen Raum (z.B. room_verbindung), während das obj_warten in den room_warten kommt.
Zum Test wird auch ein room_game gebraucht!
So! Das Erste wäre mal geschafft: Die Verbindung steht!
Nun müssen die Spieler aber miteinander kommunizieren können (d.h. Variablen miteinander austauschen).
Zuerst mal die Grundlagen:
Es gibt zum Senden der Variablen diese Befehle (In diesem Beispiel im Keyboard Right - Event des obj_spieler):
GML-Quellcode
Und zum Empfangen diese hier (Kommt in den Step - Event des obj_control):
GML-Quellcode
- var size;
- while(true)
- {
- size = receivemessage(global.otherplayer);
- if(size < 0) break;
- if(size == 0)
- {
- show_message("Dein Mitspieler hat das Spiel verlassen!");
- game_end();
- exit;
- }
- messageid = readbyte();
- switch(messageid)
- {
- case 0:
- newx = readshort()
- obj_gegner.x = newx
- break;
- case 1:
- global.gegnername = readstring()
- break;
- }
- };
Sieht vielleicht schwer aus, ist es aber nicht!
Im ersten Code wird die Variable x des obj_spieler mit dem Drücken der rechten Pfeiltaste um 2 erhöht und gleich danach wird der neue Wert der Variable x an den Gegner übertragen.
clearbuffer() löscht den Buffer (muss immer vorhanden sein!)
writebyte(0) sagt, mit welcher Variable das Ganze gesendet/empfangen werden soll. Ist diese 0, muss sie beim Empfangen der Variable auch 0 sein. Sie ist sozusagen die Kennungsvariable, damit wenn zwei Variablen gleichzeitig gesendet werden, nicht beide als x-Variable gesehen werden.
writeshort(x) sendet die Variable x. Wenn man aber einen String senden will, muss man writestring(...) schreiben (in diesem Beispiel writestring(global.spielername))!
sendmessage(global.otherplayer) sendet diese Nachricht dem Gegner.
Im zweiten Code, also im Empfang wird zuerst abgecheckt, ob der Gegner noch da ist. Wenn nein wird eine Nachricht angezeigt, dass der Mitspieler das Spiel verlassen hat. Wenn dies jedoch nicht der Fall ist, wird die messageid auf readbyte(); eingestellt. Nun kommen also wieder diese Kenungs-Variablen zum Zuge.
"case 0:" fragt ab, ob diese Variable 0 ist. Wenn ja wird die Variable newx auf die gelesene Variable (also die gesendete x-Position des Gegners) gestellt, wobei readshort() Variablen und readstring() Strings liest!
Nun bekommt das Gegner-Objekt (obj_gegner) diese Empfangene Variable als x-Wert zgeteilt.
So kann man also Variablen miteinander austauschen. Hier muss, wie gesagt immer beachtet werden, dass die Kennungs-Variablen miteinander übereinstimmen!
Um eine bessere Verbindung zu ermöglichen, sollte man noch ein obj_setnagle mit folgendem Code im Create - Event erstellen:
Hier muss als Argument0 die ID des Sockets haben, den du beschleunigen willst. Argument1 stellt dann ein, ob er beschleunigt werden soll, oder nicht.
Um die dll wieder zu entladen sollte man in einem Objekt im Game End - Event noch den Code
einfügen. Sonst werden noch kleine Dateien auf dem PC gespeichert, was allerdings nicht schlimm ist.
Ich habe hier ein sehr kleines Example in Form eines Chats gemacht, damit ihr das Ganze noch praktisch sehen könnt! Zum Downloaden HIER klicken!
Ich hoffe, das Tutorial hat euch geholfen! Bei Fragen bitte hier reinschreiben.
MfG flogy
Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von flogy ()