Kollisionen zwischen Spielern im Multiplayer-Rennspiel

8

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.

Yozer
quelle
Wäre es möglich, den Zeitschritt auf dem Server so zu erhöhen, dass zumindest weniger Korrekturen vorgenommen werden? Haben Sie versucht, die Spieler dazu zu bringen, dieselben Daten wie der Server zu verwenden (die zuletzt gesendete Position sowie die Vorhersageposition der anderen Spieler)?
user3797758
Vorschlag: Haben Sie versucht, nur den Server dazu zu bringen, die Kollision zu berechnen? Der Client wird nur zum Rendern und Senden / Empfangen von Daten verwendet (und reagiert natürlich auf alle empfangenen Daten).
Greffin28
Mögliches Duplikat des Problems der Kompensation
Congusbongus

Antworten:

1

Mach Physik nur auf dem Server. Hier ist ein Beispiel für einen Workflow:

  1. Client drückt "nach links steuern".
  2. Der Client sendet die Anforderung "Nach links lenken" an den Server
  3. Der Server empfängt die Daten.
  4. Server steuert die Instanz des Clients auf dem Server nach links.
  5. Der Server erkennt eine Kollision zwischen den Spielern.
  6. Der Server nimmt Korrekturen basierend auf der Kollision vor.
  7. Der Server sendet Positionsdaten an den Client.
  8. Der Kunde erhält die Positionsdaten.
  9. Der Client passt seine Position an.
S. Tarık Çetin
quelle
0

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.

Andreas
quelle