Je développe actuellement un jeu de tir zombie de haut en bas en temps réel. Je code cela en Java, en utilisant JBox2D comme moteur physique. J'ai codé le réseautage cette semaine, et je suis maintenant à la synchronisation physique.
Je prévois d'utiliser le modèle client prédictif / serveur faisant autorité, où le client est libre de se déplacer, tant que le serveur l'approuve plus tard. Cela implique que le client envoie des paquets contenant des données de mouvement au serveur et que le serveur calcule la latence et simule à nouveau le monde à partir d'un état plus ancien.
Mon problème est que mon moteur physique actuel, JBox2D (essentiellement un port de Box2D), ne prend pas en charge le retour en arrière dans le monde, et il n'est apparemment pas si facile de sérialiser les données mondiales. J'ai 2 solutions, je pourrais soit modifier / étendre mon moteur physique actuel, soit écrire le mien.
Raisons d'écrire mon propre moteur physique -
- Je peux supprimer des fonctionnalités inutiles. Dans un jeu descendant, je n'ai vraiment besoin que de mécanismes de collision et de forces de maniement. Aucune gravité n'est impliquée.
- Je peux mieux comprendre le code et il serait [très probablement] plus facile d'implémenter des fonctions de restauration
Raisons pour étendre / modifier JBox2D
- Écrire mon propre moteur de physique serait une tâche considérable, ce qui pourrait être fastidieux
- JBox2D a une communauté largement solidaire, qui peut m'aider avec mon développement
- JBox2D, a des optimisations spécifiques, pour des choses comme la détection de collision, qui le rendent utile
- Certains travaux ont déjà été effectués à ce sujet, mais peu de code a été partagé
Alors, quelles sont vos opinions. Ceci est mon premier jeu, et je ne suis en aucun cas un développeur de jeux professionnel. Si quelqu'un pouvait fournir des liens vers des travaux déjà effectués dans le domaine (de préférence en utilisant JBox2D / Box2D / Java).
la source
strictfp
partout, ce qui aura un impact sérieux sur les performances. Sinon, le serveur et le client peuvent ne pas obtenir exactement les mêmes résultats. Je recommanderais plutôt d'utiliser un point fixe.Réponses:
La détection de collision en 2D est tellement simple que je ne sais pas pourquoi vous vous donneriez même la peine d'utiliser un moteur physique en premier lieu. Et puisque toutes les forces de manipulation sont simples ou sur une courbe (pas de chute, modification des diagnostics, etc.) Personnellement, c'est une évidence pour moi que vous devriez choisir. Faire le vôtre est simple. Collision:
tenir compte des 3 collisions possibles qui peuvent se produire dans 2 rectangles:
EDIT: Comme indiqué, je suis beaucoup moins familier avec cette question, et ne devrait pas être consulté sur la collision balle / projectile.
Lorsque j'ai travaillé avec des balles dans l'espace 2D, j'ai utilisé une sorte de cheminement qui fonctionnait à la fois en ligne droite et en courbe où je jetterais le projectile en utilisant le moteur physique (que je n'ai pas fait à partir de zéro) et en utilisant la collision standard.
Lisez à propos de la construction à partir de zéro dans les commentaires.
EDIT: * Croyez-moi, * quel que soit celui-ci, vous aurez besoin d'une forme de calcul mort dans votre moteur de jeux, en raison des projectiles et du nombre de projectiles qui pourraient être à l'écran à un moment donné. Vous ne voulez ABSOLUMENT pas mettre à jour chaque puce à l'écran par image à son emplacement donné. Mais c'est un excellent moyen de rendre un jeu incroyablement lent: D! Vous ne devriez jamais mettre à jour ces choses:
Maintenant, mettez à jour les données dans le moteur en fonction de ces données, plutôt que sur le serveur pour chaque fichu projectile, et envoyez des données par paquet pour chaque balle. (Imaginez faire cela avec seulement 2 mitrailleuses à l'écran! Jésus!)
la source