Jeux Libres
       
           

» Les Forums » Aide à propos de la création de jeux vidéo » [FPS] Quelles sont les trames échangées ?


Aller à la page : 1.

[FPS] Quelles sont les trames échangées ?




Visiteur
Ecrit le: 23 Avril 2015, 07:38             Message non corrigé

Salut tous le monde!
Je pose cette question car je pense qu'il serait intéressant de connaître les trames échangées durant une partie sur le FPS.
Voici un exemple (corrigez moi si j'ai tord!):

Mot clé: POSITION_JOUEUR
Sens du message: Client > Serveur
Paramètres:
  • Heure [String]: Heure du joueur lorsque il envoi sa position.
  • Position X [String]: Position horizontal du joueur (à imaginer en vu de dessus).
  • Position Y [String]: Position vertical du joueur (à imaginer en vu de dessus).
  • Angle [String]: Angle dans lequel le joueur regarde.
  Profil
David



Grade : Maître
Inscrit le: 11 Mai 2005, 20:30
Ecrit le: 23 Avril 2015, 16:28             Message non corrigé

Les messages qui circulent sur le réseau sont tous codés entièrement en ASCII afin de faciliter l'analyse et le débugage avec WireShark. Les messages sont tous de la forme suivante :
1
TYPE <valeur1> <valeur2> <valeur3> ...

TYPE permet de savoir de quel type de données il s'agit. Les valeurs sont converties en ASCII. Un entier valant 123 sera codé "123". Un flotant valant 12,345678 sera codé "12.345678".

Le client pocède deux horloges : l'horloge client et l'horloge synchronisée. Pour fonctionner, le client a besoin de synchroniser l'horloge synchronisée sur celle du serveur. Pour cela, il envoi un message de type DEMANDE_HEURE.
1
DEMANDE_HEURE <heureActuelleSurHorlogeClient>

<heureActuelleSurHorlogeClient> correspond à l'heure indiquée sur l'horloge client juste avant l'envoi. Il s'agit d'un nombre entier représentant l'heure en milliseconde.

Cette demande provoquera chez le serveur l'envoi d'une réponse de type REPONSE_HEURE.
1
REPONSE_HEURE <heureDemande> <heureRecue>

<heureDemande> est l'heure à l'aquelle nous avont effectué l'envoi de la demande. Il s'agit d'une recopie de <heureActuelleSurHorlogeClient> du message DEMANDE_HEURE.

<heureRecue> est l'heure qu'il était sur l'horloge du serveur lorsqu'il nous a retourné la réponse.

Pour calculer l'heure de réglage, il suffit alors de faire :

[heureDeReglage] = <heureRecue> +  ( ([heureClientActuelle] - <heureDemande>) / 2 )

Explication : <heureRecue> indique l'heure du serveur auquel il faut ajouter un demi ping car l'heure du serveur a continué à tourné pendant le transit. Pour calculer le ping, je fais la différence entre l'heure actuelle et l'heure qu'il était lors de ma demande.
1
HEURE_PROCHAINE_PARTIE <heureProchainePartie>

Cette trame indique l'heure de la prochaine partie. Cette trame est envoyée à l'identique à tous les client.
1
HEURE_FIN_PROCHAINE_PARTIE <heureFinProchainePartie>

Ce message indique l'heure de la fin de la prochaine partie. Cette trame est envoyée à l'identique à tous les clients.
1
LISTE_JOUEURS <joueur1> <joueur2> <joueur3> <joueur4>

Ce message envoi la liste des joueurs. Il s'agit de leur pseudo. Celui-ci ne doit pas comporter d'espace. L'ordre des joueurs est important car il désigne leur identifiant. <joueur1> aura l'identifiant 0, <joueur2> aura l'identifiant 1, etc. Plusieurs joueurs peuvent porter le même pseudo. Techniquement, le pseudo ne sert pas d'identifiant.
1
NUMERO_JOUEUR <numeroJoueur>

Ce message nous indique qui nous somme. Il s'agit du numéro d'identifiant qui nous est attribué.
1
PARTIE_EN_COURS <nbSecondesRestante>

Ce message est émis par le serveur lorsqu'on souhaite s'inscrire alors qu'une partie est en cours. <nbSecondesRestante> indique le nombre de secondes restantes avant la fin de la partie.
1
PSEUDO <pseudo>

Le client émet ce message pour s'inscrire. Pour s'inscrire, il lui suffit d'envoyer son pseudo. Celui ci ne doit pas comporter d'espace.
1
SCORES <emisJoueur1> <recuJoueur1> <emisJoueur2> <recuJoueur2> <emisJoueur3> <recuJoueur3> ...

Ce message est emis aux joueurs par le serveur à la fin de la partie pour indiquer pour chaque joueur combien il a donné de coups et combien il en a reçu. L'ordre est important, il s'agit du même ordre que LISTE_JOUEURS.
1
POSITION_JOUEUR <heure> <x> <y> <angle>

Pendant la partie, ce message est envoyé au serveur par le client toutes les 50 millisecondes environ. Il indique où on se trouve et dans quelle ddirection on regarde à quelle heure. Ces données sont mémoriser par le serveur dans un historique afin de pouvoir rejouer la scène. Une interpolation est effectuée pour déterminer les positions intermédiaires.
1
SNAPSHOT <heure> <xJoueur1> <yJoueur1> <angleJoueur1> <xJoueur2> <yJoueur2> <angleJoueur2> ...

Ce message est envoyé par le serveur à tout les clients. Il décrit précisément la scène à un instant donné. Il est envoyé toutes les 50 ms.
1
REAPPARITION <idJoueur> <heureReapparition> <positionX> <positionY> <angle>

Ce message est envoyé au début de la partie et losqu'un joueur est touché. Un joueur n'est pas affiché à l'écran que si <heureReapparition> désigne une heure future. Il indique où devra réapparaitre quel joueur et à quelle heure. Si le joueur concerné est celui du client, un message apparait à l'écran indiquant un décompte avant réapparition.
1
TIR <heure>

Ce message est émis par le client au serveur lors de chaque tir. Il indique l'heure du tir et rien d'autre. Le serveur se chargera de rejouer la scène à partir de son historique afin de déterminer si un joueur est touché. Si c'est le cas, il émettera un message de type REAPPARITION et mettera à jour ses scores qu'il émettera à la fin de la partie.





________
Apprenez à créer votre propre FPS en C++ avec OpenGL. C'est pas dur ! :-)
  Profil




Visiteur
Ecrit le: 24 Avril 2015, 09:26             Message non corrigé

Thanks David pour les trames!
Pourrai-tu juste rajouter un exemple lorsque quelqu'un qui se connecte a une partie en cours, la partie se fini puis se relance, et le perso tir ?

Juste pour être sur d'envoyer les trames dans le bon ordre.
Merci!
  Profil
David



Grade : Maître
Inscrit le: 11 Mai 2005, 20:30
Ecrit le: 24 Avril 2015, 16:06             Message non corrigé

Inscription d'un joueur auprès du serveur



Le serveur boucle sur 3 phases :
- Phase d'inscription
- Phase de jeu
- Phase de publication des scores

Pendant la phase d'inscription, le client est constamment à l'écoute des messages de type REPONSE_HEURE, HEURE_FIN_PROCHAINE_PARTIE, LISTE_JOUEURS, HEURE_PROCHAINE_PARTIE, NUMERO_JOUEUR, PARTIE_EN_COURS et réagit en conséquence :
- Synchronisation de l'horloge (REPONSE_HEURE)
- Mémorisation des heures de début et de fin de la prochaine partie (HEURE_FIN_PROCHAINE_PARTIE, HEURE_PROCHAINE_PARTIE)
- Mémorisation de la liste des joueurs (LISTE_JOUEURS)
- Memorisation de notre numero de joueur (NUMERO_JOUEUR)
- Prise en compte qu'une partie est en cours (PARTIE_EN_COURS)

Parmi ces messages, tous ne peuvent pas survenir à n'importe quel moment :
Pendant la phase de jeu, seul le message PARTIE_EN_COURS est émis aux nouveau arrivant. Il n'est pas possible de s'inscrire pendant la phase de jeu.
Pendant la phase d'inscription, ce sont les 5 autres types de messages qui sont émis par le serveur.

Côté client, celui-ci cherche à s'inscrire et à se synchroniser au serveur en envoyant toutes les 200 ms des messages de type PSEUDO, DEMANDE_HEURE.

Côté serveur, la réception des messages de type PSEUDO provoquent l'ajout et le maintient du nouveau joueur à la liste de prochaine participants. Si le serveur ne reçoit pas de message de type PSEUDO pendant plus de 1000 ms, le joueur est supprimé de la liste des participants. Si PSEUDO est reçu pendant qu'une partie est en cours, c'est la trame PARTIE_EN_COURS qui est retourné au client, et la demande d'inscription n'est pas prise en compte pour le moment.

Toutes les 500 ms, le serveur émet des messages à tout les participants : LISTE_JOUEURS, NUMERO_JOUEUR, HEURE_PROCHAINE_PARTIE et HEURE_FIN_PROCHAINE_PARTIE.

Le message HEURE_PROCHAINE_PARTIE est accompagné de la valeur 0 lorsque l'heure de la prochaine partie n'est pas défini. L'heure de la prochaine partie est définit lorsqu'il y a au moins 2 participants. La partie est planifié 15 seconde après l'arrivé du deuxième participant. Si le nombre de participant redescend à 1, la partie est dé-planifiée.

Les tir



Lorsque le joueur tir, il émet le message TIR accompagné de l'heure du tir. De son côté, le serveur regarde dans l'historique ce quaurait provoqué un tir à l'heure indiqué dans la configuration des joueurs au moment du tir. Le un joueur est touché, il disparait et réapparait à une autre endroit. Le score est mis à jour en conséquence.

________
Apprenez à créer votre propre FPS en C++ avec OpenGL. C'est pas dur ! :-)
  Profil
 


Aller à la page : 1.


Hébergeur du site : David
Version PHP : 5.4.45-0+deb7u2
Uptime : 363 jours 11 heures 56 minutes
Espace libre : 1500 Mo
Dernière sauvegarde : inconnue
Taille de la sauvegarde : 1115 Mo


5671955 pages ont été consultées sur le site !
Dont 3167 pages pendant les 24 dernières heures.

Page générée en 1.202 secondes


Nos sites préférés
- Création d'un jeu de plateforme de A à Z avec SDL
- Zelda ROTH : Jeux amateurs sur le thème de Zelda
- Zeste de Savoir : la connaissance pour tous et sans pépins
- YunoHost : s'héberger soi-même en toute simplicité
- Site de Fvirtman : recueil de projets et de codes en C et C++
- Par ici la sortie : le site des idées de sorties


  © 2005-2019 linor.fr - Toute reproduction totale ou partielle du contenu de ce site est strictement interdite.