# Kleines Multiplayer-Beispiel für jPCT



## EgonOlsen (14. Mai 2007)

Hi.

Für alle, die es interessieren mag: Ich habe einen einfachen First-Person-Shooter mit jPCT gebastelt. Er bietet nicht viel, d.h. ein Model, einen Level, eine Waffe, keinen Sound usw. Ich habe das Teil hauptsächlich zu Testzwecken für Client-/Server-Krams für mich geschrieben, aber vielleicht ist es irgendwie nützlich. Eine Webstart-Version gibt es hier: www.jpct.net/demos/feud/feud.jnlp, die (in Englisch) kommentierten Quellen sowie sonstige Dateien gibt es hier: www.jpct.net/download/feud_demo.zip.
Macht damit, was ihr wollt...oder lasst es halt bleiben... :wink:


----------



## Quaxli (15. Mai 2007)

Wow! Cool - ich muß mich doch auch mal mit sowas beschäftigen. Sieht echt gut aus.
Die Steuerung über Cursor-Tasten, statt über W,A,S,D finde ich etwas störend, aber da es nur ein Demo ist, kann man das verschmerzen.


----------



## Evil-Devil (15. Mai 2007)

Irgendwie kommt mir das Teil bekannt vor. Hast du das im JGO schonmal gepostet?


----------



## EgonOlsen (15. Mai 2007)

Nein. Aber es gibt was, was denselben Level verwendet. Das hatte ich hier mal gepostet. Aber bis auf die Levelverwendung hat es nichts mit dem hier gemeinsam.


----------



## Sanix (15. Mai 2007)

Hast du den Client und Server selber geschrieben? Gefällt mir noch, den kann man gut für andere Projekte verwenden.


----------



## EgonOlsen (15. Mai 2007)

Sanix hat gesagt.:
			
		

> Hast du den Client und Server selber geschrieben?


Ja, das war der eigentliche Sinn der Sache.


----------



## Sanix (15. Mai 2007)

Dann gleich eine Frage dazu:
Du musst ja davon ausgehen, dass die Clients diesselbe Netzwerkgeschwindigkeit haben. Dies kann sich erheblich aufs Spiel auswirken. 
Annahme:
Ich mache 3 Schritte vorwärts. Bei mir wird das ganze schneller ausgeführt, da meiner Verbindung schneller ist zum Server, als bei einem Gegner. D.h. ich stehe nun vor ihm und kann auf ihn schiessen, während er mich noch gar nicht sieht.


----------



## EgonOlsen (15. Mai 2007)

Ja, das kann im Prinzip natürlich passieren. Die Demo interpoliert die Bewegungen, d.h. alle vom Server übermittelten Objekte bewegen sich auf den Clients linear so weiter, wie sie es bei der letzten Datenlieferung getan haben. Mit den neuen Daten wird dies dann irgendwann korrigiert. Wenn die Netzwerkgeschwindigkeit nicht zu schlecht ist, ist das Ergebnis sehr zufriedenstellend. Wird sie schlechter, springen die Figuren z.T.
Sieht man auch sehr schön, wenn man diverse Onlinegames mal über ISDN probiert. Du wirst in deinem Beispiel den eigentlich schon ganz woanders befindlichen Gegner aber auch nicht mehr abschießen können, weil der Server dies verhindert. Wobei man hier auch deutlich zwischen den Dingen im clientserver-Package und dem ganzen Rest trennen muss. Die Klassen im ersteren kümmern sich nur um den Transfer, sie implizieren keine bestimmte Spiellogik. Man kann sie für alles mögliche verwenden.


----------



## Roar (15. Mai 2007)

wo sind denn die ecklichen spinnen von letztem mal? ohne was abzuschießen is doch langweilig :lol:  aber läuft gut


----------



## EgonOlsen (15. Mai 2007)

Roar hat gesagt.:
			
		

> wo sind denn die ecklichen spinnen von letztem mal? ohne was abzuschießen is doch langweilig :lol:  aber läuft gut


Naja, du brauchst einen "Mitspieler"...ist halt Multiplayer und Bots gibt es keine. Aber es ist ja auch nicht als Spiel gedacht. Niemand braucht einen weiteren Multiplayer-FPS IMHO. Es diente mir nur als Testobjekt für den Serverkram.


----------



## Sanix (16. Mai 2007)

Achso, dies ist auch eine interessante Möglichkeit, d.h. du arbeitest mit absoluten Positionen. Dies gibt dem Client jedoch die Möglichkeit, seine Position zu fälschen. Ist wahrscheinlich ziemlich mühsam, dies auf dem Server zu überprüfen.
Ich habe mir zuerst ein anderes Prinzip, welches wahrscheinlich schlechter ist und eine gute Verbindung bedingt:
Wenn ein Client eine Taste betätigt, wird das in den jeweiligen Befehl übersetzt und dieser an den Server übermittelt aber noch nicht ausgeführt. Dieser führt dann einen Broadcast durch, dann führen alle Clients diesen Befehl aus.


----------



## Gast (16. Mai 2007)

Hallo,
wie hoch würdest du den Aufwand schätzen, ein einfaches Spiel wie das zu bauen?


----------



## EgonOlsen (16. Mai 2007)

Gast hat gesagt.:
			
		

> Hallo,
> wie hoch würdest du den Aufwand schätzen, ein einfaches Spiel wie das zu bauen?


Ich habe die benötigte Zeit jetzt nicht gestoppt...kommt auf deine Erfahrung an und wieviel du selber machen willst. Also an dem Sourcecode, so wie er da im ZIP liegt und ohne die JavaDOCs, habe ich ein paar Abende gearbeitet. So etwa 5 würde ich sagen und dann etwa 6h/Abend, also ca. 30h. Wenn du 3D-Engine und/oder den 3D-Content selber machen willst, dauert es natürlich wesentlich länger.


----------



## EgonOlsen (16. Mai 2007)

Sanix hat gesagt.:
			
		

> Achso, dies ist auch eine interessante Möglichkeit, d.h. du arbeitest mit absoluten Positionen. Dies gibt dem Client jedoch die Möglichkeit, seine Position zu fälschen. Ist wahrscheinlich ziemlich mühsam, dies auf dem Server zu überprüfen.
> Ich habe mir zuerst ein anderes Prinzip, welches wahrscheinlich schlechter ist und eine gute Verbindung bedingt:
> Wenn ein Client eine Taste betätigt, wird das in den jeweiligen Befehl übersetzt und dieser an den Server übermittelt aber noch nicht ausgeführt. Dieser führt dann einen Broadcast durch, dann führen alle Clients diesen Befehl aus.


Ja, der Client könnte die Position fälschen...man könnte ein paar Plausibilitätschecks ergänzen, an denen der Server krasse Fälle erkennen könnte (die Positionsänderung pro Zeiteinheit kann ja einen bestimmten Wert nicht überschreiten), aber im Prinzip hast du recht. Es ist halt die Frage, ob man damit leben kann und will oder nicht. Bei deiner Lösung kann das nicht passieren, allerdings wird sie vermutlich träger reagieren, die zeitliche Abstimmung muss perfekt sein und eine langsamer Client bremst alle anderen aus.


----------



## Evil-Devil (16. Mai 2007)

Egon, hast du den Darkstar schonmal ausprobiert? Dann bräuchtest nicht zwingend eigenen Net Code schreiben


----------



## EgonOlsen (16. Mai 2007)

Evil-Devil hat gesagt.:
			
		

> Egon, hast du den Darkstar schonmal ausprobiert? Dann bräuchtest nicht zwingend eigenen Net Code schreiben


Nein, habe ich nicht probiert und interessiert mich eigentlich auch nicht. Ich wollte eine kleine und einfache Lösung, die das tut was sie soll und nicht mehr. Und das tut sie für mich. Bevor ich mich in manche Code-Monstren eingelesen habe, habe ich es schneller selber gebaut.

Edit: Abgesehen davon müsste man den Client immer noch selber schreiben und die spielspezifische Serverlogik ebenfalls.


----------



## Sanix (23. Mai 2007)

Hi, nochmal eine Frage:
Wie läuft das bei dir genau ab? Als angenommen, ich drücke die Taste, um nach vorne zu laufen. Danach laufe ich nach Rechts.

Was machst du  dann genau?
1. Bewege eigenen Spieler nach vorne. Sende neue Position und Richtung zum Server.
2. Server sendet die Richtung und die neue Position an alle anderen Clients.
3. Die Clients setzen Figur auf neue Position und lassen die Figur in der erhaltenen Richtung weiterlaufen.
4. Client 1 bewegt Figur nun nach Rechts. Sendet Position und Richtung an den Server
5. Server broadcastet alles wieder.
etc.

Stimmt das so? Zum übermitteln, verwendest du ein eigenes Objekt, dass du derserialisierst? Hast du hier nicht zuviel Overhead? Oder sollte dies, keien Rolle spielen.


----------



## EgonOlsen (23. Mai 2007)

Ja, ziemlich genau so ist das gebaut. Wenn du in die Quellen schaust, wirst du im Client-Server-Package eine Klasse "DataContainer" finden. Die kann Strings, floats, bytes und ints in ein Bytearray wrappen. Diese Bytearrays sind es, die bei mir übertragen werden (auf Wunsch auch gezippt). Ich habe einige weitere Klassen gebaut, die den DataContainer erweitern um komplexere Typen zu übertragen (also Matrizen, Vektoren usw.) aber letztendlich landet es alles in diesen Bytearrays.


----------



## Sanix (24. Mai 2007)

Ich habe nun ein bisschen deine Sourcen angeschaut. Ist ein bisschen mühsam, da ich JPCT nicht kenne, deshalb muss ich nochmal etwas Fragen.
Ich habe Mal ein kleines Bild gemacht, wo ich Probleme sehe:
http://web85.login-18.hoststar.ch/files/public/clientserver.PNG

Wie behebst du diese? Kannst du bitte genau aufschreiben, was passiert, wenn ich mich zum Beispiel erst nach vorne bewege, danach abrupt nach links? Wäre wirklich nett.


----------



## EgonOlsen (25. Mai 2007)

Dasselbe wie in anderen Shootern (oder z.B. bei C&C Generals) auch: Die Figuren "springen", wenn die korrigierte Position übermittelt wird. Man könnte die Interpolation noch einschränken, d.h. auf anderen Clients darf sich nur solange in die "alte" Richtung bewegt werden, bis der Server eigentlich eine neue Position liefern müsste. Wenn er dies dann nicht tut, dann bleibt die Figur halt stehen, bis er es wieder tut. Ist aber in diesem Beispiel erstmal nicht eingebaut.


----------



## Guest (25. Mai 2007)

Gast hat gesagt.:
			
		

> Hallo,
> wie hoch würdest du den Aufwand schätzen, ein einfaches Spiel wie das zu bauen?


haha, das soll ein ein einfaches spiel sein?

Aufjedenfall gefällt mir das spiel sehr gut, so weit bin ich noch lange nicht.  :applaus:


----------

