Netzwerkvariante von Pong: Realisierung des Balls

G

Game2Game

Gast
Hallo,

ich will eine Netzwerkvariante einer Abwandlung von Pong realisieren. Diese App "http://itunes.apple.com/de/app/air-hockey-gold/id353410847?mt=8" zeigt relativ gut, was ich vor habe. Nun ist es so, dass jeder Spieler den Ball anstoßen kann und in eine andere Richtung lenken kann, der Ball sich sehr schnell hin und her bewegt und der Ball mit etwas zusammenprallen kann (Wand oder Spieler) und abgelenkt wird.

Und meine Frage ist, wie ich das jetzt realisieren kann. Denn ich kann ja nicht über Netzwerk jede Ballposition durchgeben (oder doch? Aber wenn jemand eine hohe Ping-Zeit hat ...), sondern muss das ja irgendwie anders hin bekommen. Wie bekomme ich es hin, dass alles synchron abläuft? Wie handhabe ich es, wenn ein Ball, der auf einem Kurs ist, von einem Spieler in eine andere Richtung gelenkt wird?

Irgendwie stelle ich mir das total schwierig vor zu realisieren. Aber sicher irre ich doch dabei, oder?
Ich hoffe Ihr könnt mir helfen,
gruß,
Game2Game
 

Atze

Top Contributor
ohne jetzt länger als 20 sek darüber nachgedacht zu haben, also ohne gewähr!!:
du könntest natürlich jede ballposition übertragen, bzw jede sekunde, halbe sekunde, in einem bestimmten intervall eben. ne andere möglichkeit um traffic zu sparen wäre, die bahn eines balls im client zu berechnen und den ermittelten start und endpunkt eines schlags zum anderen client zu übertragen. die clients zeichnen dann selbst, da sie ja die strecken durch die gesendeten punkte ermitteln können.
 

XHelp

Top Contributor
Du musst ja nur bei der Ballberührung mit dem Schläger neue Infos übertragen, der Rest müsste eigentlich auf beiden Rechnern sich determenistisch berechnen lassen.
 
G

Game2Game

Gast
Also, wenn ich immer jede Ballposition übertrage, dann gibt das ja ganz schön Traffic und außerdem weiß ich nicht ob es überhaupt möglich ist so schnelle Bewegungen zu übertragen (YouTube - Air Hockey Trailer - iPhone & iPad universal game! ab circa 25. Sekunde) oder das Netzwerk einfach zu träge ist!

Du musst ja nur bei der Ballberührung mit dem Schläger neue Infos übertragen, der Rest müsste eigentlich auf beiden Rechnern sich determenistisch berechnen lassen.
D.h. die Clients machen die Berührungserkennung und sagen dann, dass der Ball einen anderen Kurs hat (mit Angabe) und wenn der andere Client dann den Ball berührt, sagt der wieder Aktuelle Position und die neue Richtung, oder? (Man könnte es natürlich auch so lösen, dass der Server das Spiel verwaltet und der Client nur anzeigt & Mausinteraktion weiterleitet => ist wahrscheinlich die bessere Variante)

Aber ist das nicht total anfällig?
Gruß,
Game2Game
 

Kr0e

Gesperrter Benutzer
Also nur die Änderungen geht nicht.. Da das Netzwerk niemals konstant schnell ist, ergeben sich daraus ganz unausweichlich Sync-Probleme. Außerdem regeln alle modernen Netzwerkgames das mit Intervallupdates. Nur eben nicht jede MS sondern alle 30-40 Ms.
Jetzt hsat du ein Problem... 30-40 ms sieht für das Auge ruckelnd aus, davon abgesehen, kommen ja manche updates nach 20 und andere erst mal nach 50... Ergo: Geht nicht!

Lösung: Du musst ein Konzept aus intervallartigen Updates und Interpolation benutzen.
Interpolation bedeutet grob zusammengefasst, dass du zuerst auf das erste Update wartest und dann auf das zweite!
Sobald das zweite angekommen ist, kannst du loslegen zu zeichnen! Wenn du jetzt alle 5 ms zeichnen willst, berechnest du die
Differenz der beiden Updates und bewegst dein pinokel so, dass es nach 6 * 5ms an der Stelle ist, wo es laut dem Update sein sollte. Logischerweise ist das gesamte Game dann 30-40 ms in der "Vergangenheit". Bei Egoshootern kommt nun noch ein zusätzliches Verfahren ins Spiel, dass Movement Prediction genannt wird. Damit kann der Client nach Betätigung der linken Maustaste z.B. schonmal den Schuss rendern, aber der Getroffene fällt dann erst 50 ms später um, damit erzielt man 500% mehr Spielspaß;) Ist bei Bewegung und Rotation eines Spielers genau das Selbe!

Nun musst du aus meinen Tipps die für dich umsetzbaren und am besten passenden raussuchen und anwenden!

Viel Spaß und Erfolg dabei ;)


PS:

Bevor ihr hier von "Überlastung" des Netzwerks redet... Rechnet es mal durch, so gewaltig is das für einen Clienten nicht.
Der Server muss dann aber natürlich schon eine gute Anbindung haben, aber bei deinem Spiel nicht, da es ja nur einen Gegener gibt ;)

Exempel:

alle 33 Ms ein Update bedeutet 30 Updates pro Sekunde.
Angenommen jedes Update hat eine Größe von vlt 40 Byte (Was echt viel ist, sofern man sparsame Protokolle erstellt und nicht ObjectInput/OutputStreams wählt und Objekte überträgt ;-))

30*40 = 1200 byte/s. Das sind 1,2 kb oder 1,2*10^-3 mb :D Das ist so wenig... Bei einer DSL 2000 Leitung hast du einen Upload von 20kb / sek. Was wiederum bedeutet, dass du (theoretisch) ca. 15 Clienten bedienen könntest als Server mit einer DSL 2000 Leitung...

Gruß,

Chris
 
Zuletzt bearbeitet:
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben