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.
Réponses:
Faites de la physique uniquement sur le serveur. Voici un exemple de workflow:
la source
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.
la source