Collisions entre joueurs dans un jeu de course multijoueur

8

Je crée un jeu de course simple (vaisseaux spatiaux, sans gravité) en utilisant p2.js, phaser et node.js.

Ce que j'ai fait: le client reçoit l'état mondial du serveur:

  • extrapoler d'autres joueurs en fonction de la dernière vitesse / position du serveur
  • vérifier si la prédiction côté client était correcte - si aucune position d'application du serveur et des entrées de processus dont le serveur n'était pas au courant.
  • étape de physique fixe

Serveur:

  • reçoit les commentaires des clients et postule
  • étape de physique fixe
  • envoie l'état du monde à chaque client

Maintenant, je lutte avec des collisions entre joueurs. Le joueur en collision saute tout le temps pendant la collision. Je pense que c'est parce que la prédiction côté client ne calcule pas des résultats similaires au serveur.

Le serveur ne connaît pas toutes les entrées du lecteur (décalage).

Le joueur n'a pas la même position de collision avec le serveur que le serveur (décalage).

La combinaison de ces deux rend le client pour résoudre la collision différent du serveur et lorsque l'état du monde arrive, le joueur doit faire une grosse correction.

Yozer
la source
Serait-il possible d'augmenter le pas de temps sur le serveur pour qu'il y ait au moins moins de correction? Avez-vous essayé de faire utiliser aux joueurs les mêmes données que le serveur (la dernière position envoyée ainsi que la position prédictive des autres joueurs)?
user3797758
Suggestion: Avez-vous essayé de faire en sorte que seul le serveur calcule la collision? Le client ne sera utilisé que pour restituer et envoyer / recevoir des données (et réagir à toutes les données qu'il a reçues, bien sûr).
Greffin28
Duplication possible du problème de compensation de latence
congusbongus

Réponses:

1

Faites de la physique uniquement sur le serveur. Voici un exemple de workflow:

  1. Le client appuie sur "tourner à gauche".
  2. Le client envoie une demande de "direction à gauche" au serveur
  3. Le serveur reçoit les données.
  4. Le serveur dirige l'instance du client sur le serveur vers la gauche.
  5. Le serveur détecte une collision entre les joueurs.
  6. Le serveur effectue des corrections en fonction de la collision.
  7. Le serveur envoie des données de position au client.
  8. Le client reçoit les données de position.
  9. Le client ajuste sa position.
S. Tarık Çetin
la source
0

Si vous voulez que l'interaction du joueur soit instantanée, il y a quelques choix. Sinon, faites simplement de la physique côté serveur.

Option 1 : le côté client détecte la collision et les données de collision sont envoyées au serveur et / ou directement à un autre client. Certains tireurs multijoueurs font ce type de détection de collision car sinon les mécanismes de tir ne se sentiraient pas précis.

Option 2 : côté serveur fait de la physique, mais fait de nombreuses prédictions différentes. Vous pouvez simplement utiliser plus d'instances de chaque joueur et les prédire pour faire des choses légèrement différentes. Assurez-vous qu'ils ne s'entrechoquent pas et n'envoyez pas les données aux clients. Chaque fois que le mouvement du joueur correspond à une prédiction, vous utilisez les données qui ont déjà été envoyées au client.

Andreas
la source