Multiplayer Demo

Ihr habt ein Spiel mit PaC-DK gemacht oder seit gerade dabei? Dann zeigt etwas davon hier!
Post Reply
Benni
Tutorial Reader
Posts: 65
Joined: 09 Jan 2009, 23:38

Multiplayer Demo

Post: # 74062Post Benni
10 Jul 2009, 18:27

Wujis Idee, einen einfachen Multiplayermodus über die savenum() Funktion und einen im Netzwerk freigegebenen saves-Ordner umzusetzen, hat mich auf die Idee gebracht, das ganze über einen PHP-Webserver zu realisieren. Das Ergebnis ist eine kleine Demo für zwei Spieler, die sich - über Internet synchronisiert - in der Map hin und her bewegen können.


Das ganze funktioniert folgendermaßen: Zunächst einmal habe ich ein unsichtbares Objekt über den kompletten Raum gelegt. Wann immer man irgendwo hinklickt, um sich zu bewegen, klickt man in Wirklichkeit auf das Objekt. Diese Sensorfläche errechnet dann aus den [mousex]/[mousey] Pixelkoordinaten der Maus die Position auf der Walkmap, die man angeklickt hat. Diese Werte werden über savenum() exportiert. Anschließend wird der Charakter mit walkto() zu der angeklickten Stelle bewegt, so dass es für den Spieler so erscheint, als hätte er ganz normal in den Raum geklickt.
Im on(loop1) Skript des Raums werden dann kontinuierlich die Werte other_x und other_y über loadnum() importiert. Das sind die Walkmap-Koordinaten des anderen Spielers. Dieser wird dann ebenfalls mit walkto() an die entsprechende Stelle bewegt.

Auf der Serverseite sitzt ein PHP-Skript, das über die URL eine Session-ID, eine Spieler-ID (1 oder 2) und die Walkmap-Koordinaten des Spielers bekommt. Die Session-ID bekommt derjenige, der das Spiel aufmacht und erlaubt es, dass mehrere unabhängige Spiele über den gleichen Server laufen. Sie entspricht also in etwa den Spielnamen im Battle.net bei Diablo 2, nur dass du hier einfach nur eine Zahl hast statt "DupeItems4Free". ;-)
Spieler 1 in Session 42 auf Server http://gehirnmutant.de/pacmp, der auf Koordinaten 10/15 sitzt, würde also folgende URL aufrufen:
http://gehirnmutant.de/pacmp/pac-mp.php ... &x=10&y=15
Das Skript speichert dann die neuen Koordinaten des Spielers in der Datenbank und liefert als Antwort die aktuellen Koordinaten des anderen Spielers zurück, also zwei Zahlen, getrennt durch ein Leerzeichen.

Zu guter Letzt brauchen wir noch eine Verbindungsschicht zwischen dem Server und dem Spiel. Hierzu habe ich ein kleines Java-Programm geschrieben, das ständig die nums.sav, in der die exportierten Zahlen vom PaC-DK gespeichert werden, einliest, die Koordinaten des Spielers an den Server schickt, und die vom Server erhaltenen Koordinaten anschließend wieder in die nums.sav einträgt.

Eine Demo davon gibt es hier: http://gehirnmutant.de/pacmp/pacmp.7z
Den Quellcode gibt es unter: http://gehirnmutant.de/pacmp/source.7z

Zum Starten der Demo einfach auf die start.bat doppelklicken. Eine aktuelle Java Laufzeitumgebung wird benötigt.

Da das ganze eine Multiplayer-Demo ist, braucht man natürlich 2 Leute (oder zumindest 2 Rechner), um es vernünftig zu testen. Der erste Spieler klickt in dem Fenster, das aufgeht wenn man start.bat öffnet, auf "Spiel erstellen" und teilt dem zweiten Spieler die Session-ID mit, die er zugewiesen bekommen hat. Der zweite Spieler trägt diese Session-ID dann in das Eingabefeld ein und klickt auf "Spiel beitreten". Einen eigenen Webserver braucht ihr für diese Demo nicht, mein Server ist bereits als Voreinstellung eingetragen.


Das Hauptproblem hier ist, dass das on(loop1) des Raumskripts nicht besonders häufig ausgeführt wird. Darum hat man immer eine Verzögerung von ca. 1 Sekunde in der Reaktion. Außerdem kann man bisher nur Positionen übertragen. Wenn man mehr Variablen exportiert, lässt sich das System natürlich noch etwas ausdehnen, aber für ein wirklich sinnvolles Multiplayer-Spiel wird man mit dem Umweg über die nums.sav glaube ich nicht glücklich. Für Online-Highscorelisten und ähnliches, wo es nicht besonders auf die Reaktionszeit ankommt, ist der Ansatz aber wohl brauchbar (auch wenn man noch ein bißchen dran feilen sollte, damit nicht ständig Daten übertragen werden müssen).

Benni
Tutorial Reader
Posts: 65
Joined: 09 Jan 2009, 23:38

Post: # 74063Post Benni
10 Jul 2009, 19:22

Ich hab eben einen seltsamen Bug gefunden. Wenn ich in der Multiplayer-Demo versuche, mit walkto(pacman1;25;19) Spieler1 auf Punkt 25/19 laufen zu lassen, hängt das Spiel sich auf. Auch wenn ich es ohne meine Erweiterung starte, also direkt die vom PaC-DK erzeugte exe-Datei. Andere Walkmap-Punkte kann ich hingegen ohne Probleme ansteuern. Mache ich irgendwas mit meinen Skripten falsch oder ist das ein Bug im PaC-DK?

Wuji
Adventure Enthusiast
Posts: 223
Joined: 07 Dec 2008, 17:25
Contact:

Post: # 74073Post Wuji
11 Jul 2009, 16:23

ich würde mir den Walkmap punkt anschauen. Entweder er ist nicht frei oder es steht ein skript auf ihm.

Ver besserung vorschlag: das mit der Maus positon ist nicht sehr genau weil wen man klickt heißt das ja nicht das der spieler sofort an diesem Punkt ist ich würde eher eine funktion schreiben


Funtkion für Char1


Setnum(Char1x;[charx:*Spielername*])
Setnum(Char1y;[chary:*Spielername*])

Setnum(Char1xWalkmap;[Char1x]/*Auflösungzahl*)
Setnum(Char1yWalkmap;[Char1y]/*Auflösungszahl*)

timer(0,2) (*Sagt aus wie oft sich das Spiel aktualiesieren soll*)
savenum(Char1xWalkmap)

timer(0,2) (*Sagt aus wie oft sich das Spiel aktualiesieren soll*)
savenum(Char1yWalkmap)

loadnum(Char2xWalkmap)
loadnum(Char2yWalkmap)
walkto(Char2;[Char2xWalkmap];[Char2yWalkmap])


Funtkion für Char2


Setnum(Char2x;[charx:*Spielername*])
Setnum(Char2y;[chary:*Spielername*])

Setnum(Char2xWalkmap;[Char2x]/*Auflösungzahl*)
Setnum(Char2yWalkmap;[Char2y]/*Auflösungszahl*)

timer(0,2) (*Sagt aus wie oft sich das Spiel aktualiesieren soll*)
savenum(Char2xWalkmap)

timer(0,2) (*Sagt aus wie oft sich das Spiel aktualiesieren soll*)
savenum(Char2yWalkmap)

loadnum(Char1xWalkmap)
loadnum(Char1yWalkmap)
walkto(Char1;[Char1xWalkmap];[Char1yWalkmap])
Die Auflösungs zahl
erhälst du so:

Die Walkmap größe richtet sich nach deiner Auflösung des Spiels und ob du eine Doppelte Walkmap benutzt.

Bei normaler :

320er : 10 Pixel
640er : 20 Pixel
800er : 25 Pixel
1024er : 32 Pixel

bei doppelter Walkmap halbiert sich der Wert
Last edited by Wuji on 11 Jul 2009, 17:07, edited 1 time in total.

Benni
Tutorial Reader
Posts: 65
Joined: 09 Jan 2009, 23:38

Post: # 74076Post Benni
11 Jul 2009, 16:38

Auf dem Walkmap-Punkt ist weder ein Skript noch ist er blockiert. Es existiert auch ein begehbarer Pfad von der Position des Spielers zu diesem Punkt. Da ich in einem anderen Projekt genau so einen Aufhäng-Bug mit einem setbool() Befehl hatte, beschleicht mich eigentlich eher die Vermutung, dass da ein Fehler im Skriptsystem allgemein dahinter steckt.
Wuji wrote:Ver besserung vorschlag: das mit der Maus positon ist nicht sehr genau weil wen man klickt heißt das ja nicht das der spieler sofort an diesem Punkt ist ich würde eher eine funktion schreiben
Darum verwende ich ja nicht beamto() sondern walkto(). Die exportierten Zahlen sind das Ziel des Charakters, nicht die tatsächliche Position. Mit deinem Vorschlag würde man die Verzögerung durch das Netzwerk und das Rumkopieren der nums.sav-Datei noch viel deutlicher spüren. So wie es jetzt ist, geht der Charakter einfach nur ein bißchen später los (so ca 0.5 bis 1 Sekunde), ansonsten ist die Bewegung aber flüssig. Das ist aber auch genau der Grund, warum ich denke dass es in seiner derzeitigen Form für richtige Echtzeit-Interaktionen nicht geeignet ist.

Michel
Tutorial Reader
Posts: 81
Joined: 09 May 2007, 11:07
Location: Darmstadt
Contact:

^^

Post: # 74456Post Michel
11 Sep 2009, 10:36

Hat hier echt noch niemand HEY WAHNSINN MULTIPLAYER MIT PAC DK geschrieben? Na dann... ;)
Lerne Fliegen, nicht laufen. Lass die Anderen das Leben ruhig von unten betrachten.

- Michel Landau

Wuji
Adventure Enthusiast
Posts: 223
Joined: 07 Dec 2008, 17:25
Contact:

Post: # 75465Post Wuji
02 Apr 2010, 18:25

@ Benni ich hab dir mal ne pn geschickt

Post Reply