Ich erstelle ein einfaches Rennspiel (Raumschiffe, keine Schwerkraft) mit p2.js, phaser und node.js.
Was ich getan habe: Client erhält Weltstatus vom Server:
- Extrapolieren Sie andere Spieler basierend auf der neuesten Geschwindigkeit / Position vom Server
- Überprüfen Sie, ob die clientseitige Vorhersage korrekt war - wenn keine Position von Server- und Prozesseingaben angewendet wurde, die dem Server nicht bekannt waren.
- fester Physikschritt
Server:
- empfängt Eingaben von Kunden und bewerben sich
- fester Physikschritt
- Sendet den Weltstatus an jeden Client
Jetzt kämpfe ich mit Kollisionen zwischen Spielern. Der kollidierende Spieler springt während der Kollision ständig. Ich denke, das liegt daran, dass die clientseitige Vorhersage keine ähnlichen Ergebnisse wie der Server berechnet.
Der Server kennt nicht alle Eingaben vom Player (Verzögerung).
Der Spieler hat nicht die gleiche Position des kollidierenden Spielers wie der Server (Verzögerung).
Wenn diese beiden kombiniert werden, löst der Client eine andere Kollision als der Server. Wenn der Weltstatus eintrifft, muss der Spieler eine große Korrektur vornehmen.
Antworten:
Mach Physik nur auf dem Server. Hier ist ein Beispiel für einen Workflow:
quelle
Wenn Sie möchten, dass sich die Interaktion mit dem Spieler sofort anfühlt, gibt es einige Möglichkeiten. Wenn nicht, dann mache einfach Physik auf der Serverseite.
Option 1 : Die Clientseite erkennt Kollisionen und Kollisionsdaten werden an den Server und / oder direkt an einen anderen Client gesendet. Bestimmte Multiplayer-Schützen führen diese Art der Kollisionserkennung durch, da sich die Schießmechanik sonst nicht genau anfühlt.
Option 2 : Die Serverseite macht Physik, macht aber viele verschiedene Vorhersagen. Sie können einfach mehr Instanzen jedes Spielers verwenden und vorhersagen, dass sie etwas andere Dinge tun. Stellen Sie sicher, dass sie nicht selbst kollidieren, und senden Sie die Daten an die Clients. Jedes Mal, wenn die Spielerbewegung mit einer Vorhersage übereinstimmt, verwenden Sie die Daten, die bereits an den Client gesendet wurden.
quelle