Kleines Multiplayer-Beispiel für jPCT

Status
Nicht offen für weitere Antworten.

EgonOlsen

Bekanntes Mitglied
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

Top Contributor
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.

laola.gif
 

EgonOlsen

Bekanntes Mitglied
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

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

Sanix

Top Contributor
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

Bekanntes Mitglied
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.
 
R

Roar

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

EgonOlsen

Bekanntes Mitglied
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

Top Contributor
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.
 
G

Gast

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

EgonOlsen

Bekanntes Mitglied
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

Bekanntes Mitglied
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

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

EgonOlsen

Bekanntes Mitglied
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

Top Contributor
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

Bekanntes Mitglied
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

Top Contributor
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

Bekanntes Mitglied
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.
 
G

Guest

Gast
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:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
X Kleines Problem mit Java Reflections und einem eigenen Eventhandler Spiele- und Multimedia-Programmierung 1
M Kleines Spongebobspiel / Hilfe gesucht Spiele- und Multimedia-Programmierung 2
Kenan89 Kleines Game Spiele- und Multimedia-Programmierung 26
Kenan89 Kleines Projekt für Java Spiele- und Multimedia-Programmierung 5
D [JOGL 2.0] Kleines Problem mit freier Flugsteuerung Spiele- und Multimedia-Programmierung 3
U [JOGL 1.1.1a]Kleines Problem mit Text Overlays: Spiele- und Multimedia-Programmierung 19
R Netzwerkstruktur für ein kleines Spiel Spiele- und Multimedia-Programmierung 8
J Brauche denkanstoß für kleines grafikframework Spiele- und Multimedia-Programmierung 3
J Tips für ein kleines Pong-Applet Spiele- und Multimedia-Programmierung 4
Steev Performancetest: Kleines Spielchen Spiele- und Multimedia-Programmierung 25
L Kleines Aktienspiel, Problem: Persistenz Spiele- und Multimedia-Programmierung 16
L Kleines RTS Game -> Netzwerkproblem Spiele- und Multimedia-Programmierung 5
Apo Kleines Graphenspiel Spiele- und Multimedia-Programmierung 3
A Kleines Denksportspiel Spiele- und Multimedia-Programmierung 6
M Testet mal mein kleines Memory Spiel ... Spiele- und Multimedia-Programmierung 14
DEvent ein kleines Billiard Spiel und die bewegungen der Kugeln Spiele- und Multimedia-Programmierung 3
Z Minecraft Multiplayer geht nicht Spiele- und Multimedia-Programmierung 2
G [Game-Multiplayer] Welt vom Server zum Client senden. Spiele- und Multimedia-Programmierung 0
S Multiplayer Spiele- und Multimedia-Programmierung 2
M Multiplayer-Game auf Website Spiele- und Multimedia-Programmierung 2
M Multiplayer Game mit Frontend auf HTML5 - ohne ständigen Client Request - Möglich?! Spiele- und Multimedia-Programmierung 12
antonbracke Multiplayer Shooter mit NullPointerException Spiele- und Multimedia-Programmierung 4
c_sidi90 Server/Client Struktur Multiplayer Spiele- und Multimedia-Programmierung 9
O Konzepthilfe - Multiplayer TD Spiele- und Multimedia-Programmierung 6
O Suche Tutorial zum Aufbau von großen Spielen(mit Multiplayer über Netzwerk...) Spiele- und Multimedia-Programmierung 3
C 2D Multiplayer Game Spiele- und Multimedia-Programmierung 5
Z Multiplayer Applet RPG Spiele- und Multimedia-Programmierung 9
E Robombs - Multiplayer-LAN-Gebombe Spiele- und Multimedia-Programmierung 45
M Java online multiplayer game Spiele- und Multimedia-Programmierung 2
P Suche Tutorial für Multiplayer Spiele- und Multimedia-Programmierung 2
O Multiplayer Games gesucht Spiele- und Multimedia-Programmierung 2
D Isometric Tile Map Beispiel gesucht Spiele- und Multimedia-Programmierung 1
K Grundsätzlicher Spieleaufbau an (m)einem Beispiel Spiele- und Multimedia-Programmierung 4
F Meine Aufgabe: Client-Server am Beispiel einer Implementation eines Tic-Tac-Toe Netzwerkspieles Spiele- und Multimedia-Programmierung 7
R Verstehe Beispiel-Code nicht Spiele- und Multimedia-Programmierung 7

Ähnliche Java Themen

Neue Themen


Oben