Rendre un jeu multi-joueurs jouable sur un réseau ou sur Internet
Salut, j'ai écrit un jeu multi-joueurs en Java et je me demandais ce que j'ai besoin d'apprendre et/ou ce que je devrais utiliser pour rendre le jeu jouable sur un réseau ou sur internet par plusieurs ordinateurs. Je suis vraiment désemparés quant à où commencer, donc tout conseil serait utile, merci.
source d'informationauteur Bob Anderson
Vous devez vous connecter pour publier un commentaire.
Ceux d'autres réponses sont à la fois assez haut niveau, ce qui est bien, mais vous ne voulez pas de haut niveau, vous voulez de bas niveau, comme dans "comment puis-je faire réellement envoyer des données et de ce que cela signifie et à quoi dois-je l'envoyer , etc." Voici ce que vous devez faire:
D'abord, le protocole TCP ou UDP? Si vous ne savez pas ce que ces choses sont, de lire sur eux que je n'ai pas l'espace pour donner un bon aperçu sur les deux ici, mais pour votre choix connaissez la suite:
Alors, demandez-vous ce qui est important, apprendre comment TCP et UDP de travail, et ensuite faire un choix intelligent.
Cela dit, maintenant, vous devez synchroniser l'état de l'objet à travers le réseau. Cela signifie que vos objets besoin de sérialiser à quelque chose qui peut être représenté dans un flux d'octets et de l'écrit à une prise de courant. L'écriture d'un socket est facile; si vous pouvez l'écrire dans un fichier, vous pouvez écrire à un socket, c'est vraiment pas dur. Ce qui est important est de s'assurer que vous êtes en mesure de représenter un objet comme un tampon, de sorte que si votre objet a des références/pointeurs vers d'autres objets, vous ne serez pas en mesure de simplement envoyer ces pointeurs, car ils sont différents sur les autres clients, donc vous devez les convertir en quelque chose qui est commun à tous les hôtes. Cela signifie que les ID, bien que d'un objet ID doit être unique sur tous les hôtes, donc vous devez avoir un moyen de coordonner entre les hôtes et les hôtes de créer différents objets avec le même ID. Il existe des moyens pour gérer les hôtes à faire cela, mais nous ne vous inquiétez pas à ce sujet ici (astuce: utiliser une sorte de correspondance entre l'hôte ID et l'ID de réseau. Grand conseil: ne le faites pas si vous n'avez pas besoin d').
Alors maintenant, vous pouvez envoyer des données, la grande, maintenant ce qui? Chaque fois que le jeu de modifications de l'état, vous devez envoyer une mise à jour pour les autres machines en quelque sorte. C'est là que l'architecture client-serveur arrive, ou peer-to-peer si vous le souhaitez. Client-Serveur est plus facile à mettre en œuvre. Aussi, un hôte "agir" comme le serveur est encore en Client-Serveur et quiconque dit différemment, c'est mal.
Donc, le serveur a la responsabilité de "propre" en tout état de jeu. Seul le serveur peut définitivement dire quel est l'état d'un objet. Si vous souhaitez déplacer un objet, vous dire au serveur que vous souhaitez déplacer, cependant, le serveur vous dit que vous devez déplacer l'objet, vous ne vous contentez pas de le faire (bien que certains sorte de client-côté de prédiction est souvent utile). Puis le serveur envoie la mise à jour de l'état de l'objet à tous les autres hôtes.
Donc, vous avez parlé d'un jeu au tour par tour, non? Très simple:
C'est tout ce que vous devez faire pour un jeu au tour par tour. Astuce: l'Utilisation du protocole TCP
Gros indice: TCP met en œuvre quelque chose appelé "l'Algorithme Nagle" qui permettra de combiner vos messages dans un seul paquet. Ce que cela signifie est que si vous envoyer deux messages distincts avec deux appels distincts à "Envoyer", il est possible que les autres hôtes recevront uniquement un paquet sur un seul appel à "Recevoir", mais le paquet contiendra le contenu de DEUX paquets qui ont été envoyés. Ainsi, si vous envoyez 100 deux octets des paquets avec deux appels à envoyer, vous pouvez en obtenir un de 200 octets par paquet sur un simple appel pour recevoir. C'est normal, de sorte que vous devez être en mesure de faire face avec ce en quelque sorte. Une astuce consiste à faire de chaque paquet de la même taille, et puis il suffit de lire ce nombre d'octets à partir de la prise à chaque fois que vous vérifiez l'entrée. Gardez également à l'esprit que vous pourriez obtenir partielle des messages. Par exemple, si vous envoyez 100 deux octets des messages, ils peuvent être combinés dans un seul 200 octets du message. Ensuite, si vous lisez à partir de la prise de courant à l'autre extrémité, mais vous lisez avec une taille de mémoire tampon de 150 octets, vous aurez 150-octets, qui contient le premier paquet et une partie de la seconde. Vous aurez à faire un deuxième appel pour recevoir à obtenir le reste de la deuxième message, afin de GARDER une TRACE de la QUANTITÉ DE DONNÉES que VOUS AVEZ REÇU de sorte que vous ne manquez pas partie d'un paquet quelque part. C'est pourquoi garder vos paquets de la même taille est utile.
Il y a un certain nombre d'autres astuces utiles pour réduire la taille et la fréquence de vos messages et pour garder une trace des jeux qui ne sont pas au tour par tour et agir en temps réel, mais si vous avez un jeu au tour par tour, puis la bonne chose à faire est probablement d'utiliser le protocole TCP et ne pas vous soucier de tous ces autres trucs. Voici quelques liens vers des sites web utiles et des articles qui vous donnera plus de renseignements sur comment le jeu de la programmation réseau est fait:
Laissez-moi savoir si vous voulez plus de détails sur l'un de ces trucs ou si vous avez des questions plus spécifiques.
Si vous voulez ajouter la fonctionnalité multijoueur sur le réseau, il peut être utile pour vous de prendre un coup d'oeil à la Netty projet pour construire l'infrastructure de communication.
Mais avant que vous pouvez faire cela, vous devez assurez-vous que votre jeu a le droit "de l'architecture". Vous avez besoin d'avoir de grands modules: le Client et le Serveur.
Le Serveur est responsable de toute la logique du jeu. Dans un sens, c'est le moteur du jeu. Le Client est responsable pour interroger le Serveur pour le jeu de l'état, de l'afficher au joueur, obtenir le joueur de saisie et l'envoi des commandes au serveur.
Une façon de dissocier notre code Client et Serveur, sans les tracas impliqués dans le réseau d'apprentissage de la programmation est d'avoir deux différents programmes qui s'exécutent à partir de la CLI. La séquence de l'exécution peut être comme ceci:
Rincer et répéter. C'est essentiellement ce qu'PBEM des serveurs.
Pour aider à découpler le Client et le Serveur, il est logique de définir un "langage" pour représenter l'évolution de l'état du jeu, et les commandes devant être exécutées par le serveur. Il aide si le client met en cache l'état et appliquer les modifications envoyés depuis le serveur.
Une fois votre code Client et Serveur est complètement découplé, et la "langue" est complètement défini, vous êtes prêt à modifier le mécanisme de communication de base de fichiers d'être basés sur un socket.
Une approche architecturale serait d'avoir une seule instance de la loi sur la chasse en tant qu'hôte (par exemple, le premier à se lancer). Il serait chargé de coordonner le jeu et d'envoyer des informations de l'état de la partie et se tourne vers chacun des autres joueurs.
Quand un joueur fait un mouvement, il envoie les informations de l'hôte, ce qui permettrait de mettre à jour l'état du jeu (et de vérifier la validité de la déplacer, etc.). Il serait alors envoyer le nouveau jeu de chacun des joueurs et également envoyer (probablement comme une communication distincte) notification au prochain tour pour le client approprié et d'attendre sa réponse.
Dans un certain sens, l'hôte agit en tant que serveur de jeu dans ce scénario, mais peut-être plus simple à utiliser/lire en ce qu'il n'est pas un processus distinct qui doit être exécuté dans le but de jouer le jeu.