ich frage mich gerade ganz allgemein, wie man am besten vorgeht, wenn man ein kleines Spielchen programmieren möchte, welches später von zwei Computern aus gespielt werden kann. Es geht mir hierbei nicht um die Frage, wie ich Informationen von einem Computer zum anderen Computer per LAN übertragen kann! Dass die Datenübertragung an sich funktioniert setzte ich als gegeben voraus.
Wenn es also z.B. zwei Spielfiguren gibt, die sich gegenseitig einen Ball zuwerfen sollen.
Benutzt man für das nach Links- und nach Rechtslaufen die Cursortasten und überträgt die Tastenanschläge an den anderen Computer, so könnte ich mir vorstellen, dass lokal mehr Tastenanschläge verarbeiten und in Bewegung für die eigene Spielfigur umgesetzt werden, als tatsächlich übertragen und auf dem anderen Computer für die eigene Spielfigur verarbeitet werden.
Wenn ich also nicht die Tastenanschläge an sich übertrage, dann muss ich die Positionsinformation meiner Spielfigur auf den anderen Computer übertragen. Sollte in diesem Fall eine Aktualisierung auf dem entfernten Computer nicht durchgeführt werden können – aus welchem Grund auch immer – so würde meine eigene Spielfigur auf dem entfernten Computer bei der nächsten erfolgreichen Datenübertragung einen entsprechend „größeren“ Schritt machen und wäre wieder auf der korrekten Position.
So weit so gut, aber wer berechnet und bestimmt die Position des Balls? Eines der beiden Programme muss also als Server agieren. Dieser Server ist nicht nur für die Spielfigur des Spielers, sondern auch für alle anderen „beweglichen Objekte“ wie z.B. dem Ball zuständig.
Wer würde jetzt entscheiden, ob die Spielfigur auf dem „Client“ den Ball gefangen hat? Die Positionsdaten der Spielfigur des „Clients“ sind eh bekannt. Zudem wurden die Positionsdaten des Balls übertragen. Da der Server aber die Positionsdaten des Balls überträgt / berechnet / verwaltet, müsste die Entscheidung, ob die Spielfigur auf dem Client den Ball gefangen hat oder nicht, wieder vom Server getroffen werden, oder?
Mhh..ja ich weiß, merkwürdige Fragen. Kennt jemand von euch ein Konzept für die oben beschriebene Aufgabenstellung oder kann mir Tipps geben, wie man an so eine Aufgabe am besten ran geht?
Also ich würde zusätzlich zur Position auch die Geschwindigkeit übertragen. Zusätzlich braucht jedes Paket auch einen Zeitstempel (*). So kann die andere Seite die aktuelle Position berechnen, auch wenn das Paket ja eigentlich aus der Vergangenheit stammt. In deinem Beispiel des Balls ist das ja recht einfach: Einmal geworfen folgt der Ball einer physikalisch definierten Flugbahn. D.h. beide Seiten können die Flugbahn exakt berechnen sofern Position, Geschwindigkeit, Masse usw. des Balls zu einem Zeitpunkt bekannt sind.
(*) Achtung: die Uhren beider Computer müssen natürlich möglichst synchron sein. Da man ja normalerweise Administrator-Rechte benötigt um die Uhrzeit zu ändern muss man sich ggf. eine eigene Uhr bauen die man dann mit einem Zeitserver (de.pool.ntp.org, etc...) synchronisiert.
Registriert: Sa Aug 18, 2007 18:47 Beiträge: 694 Wohnort: Köln
Programmiersprache: Java
Peer2Peer:
Bei Strategiespielen ist es häufig so, dass beide Rechner die komplette Spiellogik nachvollziehen und nur ab und zu eine Checksumme ihrer Daten und die Spielzüge/Eingaben der Spieler übertragen. Sobald die Checksumme nicht mehr stimmt werden die kompletten Daten von einem zum anderen übertragen, um wieder ein synchrones Spiel zu ermöglichen (Die meisten Spiele haben aber Probleme damit und beenden das Spiel mit einem 'Out-Of-Sync'-Fehler o.ä. .
Ein weiteres Problem ist, dass die Performance auf beiden Rechner relativ gleich sein muss (bzw sollte einer der beiden Rechner nicht gerade am Limit laufen), da das Spiel sonst ständig aus dem Sync läuft. Vorteil ist der relativ geringe Bandbreitenbedarf.
Client/Server:
Client sendet nur die Eingaben des Spielers an den Server. Zurück kommen (im optimalen Falle) nur die für diesen Spieler interessanten Daten (sichtbare Gegner). Wichtig könnte hier sein, dass der Server nicht nur die Positionen der Spieler und Objekte, sondern auch deren Geschwindigkeit etc übertragt. Somit kann der Client dann ein etwas flüssigeres Spiel ermöglichen, indem im ein oder anderen Frame -wenn mal gerade kein Paket vom Server kam- die Positionen interpoliert werden.
Heutzutage kann man sicher immer auf die Client/Server Variante setzen. Bandbreite ist nicht mehr ganz sooo wichtig in Zeiten von DSL und Kabelzugängen.
[EDIT]
Bei Peer2Peer muss man natürlich darauf achten, dass jegliche Spiellogik auch wirklich exakt gleich abläuft auf jedem Rechner und dass man z.b. bei Zufallsgeneratoren nicht auf die Uhrzeit zurückgreift. So exakt bekommt man die beiden Uhren nämlich nie hin.
_________________ Es werde Licht. glEnable(GL_LIGHTING); Und es ward Licht.
Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"
Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.