- S’abonner aux notifications de modification de session Multiplayer Session Directory (MPSD)
- Créer une session MPSD
- Définir un arbitre pour une session MPSD
- Gérer l’activation du titre
- Rendre l’utilisateur joignable
- Envoyer des invitations de jeu
- Rejoindre une session de jeu à partir d’une session de lobby
- Rejoindre une session MPSD à partir d’une activation de titre
- Définir l’activité actuelle de l’utilisateur
- Mettre à jour une session MPSD
- Quitter une session MPSD
- Remplir les emplacements de session libres pendant le matchmaking
- Créer un ticket de match
- Obtenir l’état d’un ticket de match
S’abonner aux notifications de modification de session Multiplayer Session Directory (MPSD)
L’abonnement aux modifications d’une session exige que le joueur associé soit actif dans la session. Le champ
connectionRequiredForActiveMembers doit également être défini sur true dans l’objet /constants/system/capabilities de la session. Ce champ est généralement défini dans le modèle de session. Pour plus d’informations, consultez Modèles de session multijoueur et Vue d’ensemble de Multiplayer Session Directory.-
Utilisez le même objet
XblContextHandlepour tous les appels d’un même utilisateur. Les abonnements sont liés à la durée de vie de cet objet. S’il y a plusieurs utilisateurs locaux, utilisez un objetXblContextHandledistinct pour chaque utilisateur. - Implémentez des gestionnaires d’événements pour XblMultiplayerAddSessionChangedHandler et XblMultiplayerSessionSubscriptionLostHandler.
-
Si vous vous abonnez aux modifications pour plusieurs utilisateurs, ajoutez du code à votre gestionnaire d’événements
XblMultiplayerAddSessionChangedHandlerpour éviter un travail inutile. Utilisez la propriété XblMultiplayerSessionChangeEventArgs::Branchet la propriété XblMultiplayerSessionChangeEventArgs::ChangeNumber. Ces propriétés vous permettent de suivre la dernière modification vue et d’ignorer les modifications plus anciennes. - Appelez XblMultiplayerSetSubscriptionsEnabled pour autoriser les abonnements.
- Créez un objet de session local, puis rejoignez cette session en tant que membre actif.
-
Appelez
XblMultiplayerAddSessionChangedHandlerpour chaque utilisateur, en transmettant le type de modification de session pour lequel vous souhaitez être notifié. - Écrivez la session dans MPSD comme décrit dans la section Mettre à jour une session MPSD de cette rubrique.

Analyse des notifications de modification de session en double
Lorsque plusieurs utilisateurs sont abonnés aux notifications d’une même session, chaque modification de cette session déclenche un shoulder tap pour chaque utilisateur. Tous ces shoulder taps, sauf un, sont des doublons. Bien que nous recommandions toujours qu’un titre abonne chaque utilisateur d’une session aux notifications, un titre doit ignorer les modifications dont il a déjà été notifié. Vous pouvez le faire à l’aide des propriétésBranch et ChangeNumber.
Pour détecter les shoulder taps multiples, un titre doit procéder comme suit :
-
Stocker la dernière valeur de la propriété
ChangeNumberpour chaque valeur de la propriétéBranchévaluée. -
Si un shoulder tap a une valeur de propriété
ChangeNumbersupérieure à la dernière valeur stockée pour cette valeur de propriétéBranch, traiter le shoulder tap, puis mettre à jour la dernière valeur de la propriétéChangeNumber. -
Si un shoulder tap n’a pas de valeur de propriété
ChangeNumbersupérieure pour cette valeur de propriétéBranch, ignorer le traitement du shoulder tap. Cette modification de session a déjà été traitée.
Les valeurs de la propriété
ChangeNumber doivent être suivies par valeur de la propriété Branch, et non par session. La valeur de la propriété Branch peut changer au cours de la durée de vie d’une session, ce qui réinitialise la valeur de la propriété ChangeNumber.Créer une session MPSD
Par défaut, une session MPSD est créée lorsque le premier membre la rejoint. Si la logique de votre titre s’attend à ce que la session existe ou n’existe pas au moment de la jonction, elle peut transmettre une valeur de mode d’écriture appropriée à la méthode d’écriture lors de la mise à jour de la session.
-
Créez un nouvel objet
XblContextHandle. Votre titre crée cet objet une seule fois, l’stocke et le réutilise selon les besoins dans tout le code source. Il est nécessaire d’utiliser exactement le même contexte, en particulier lorsque vous travaillez avec des abonnements de session. -
Créez un nouveau
XblMultiplayerSessionHandleavec XblMultiplayerSessionCreateHandle pour préparer toutes les données de session dont MPSD a besoin pour créer une nouvelle session. - Apportez les modifications requises avant d’écrire la session dans MPSD. Par exemple, lors de la jonction d’un membre à la session avec un appel à XblMultiplayerSessionJoin, le client ajoute des données de requête locales masquées qui indiquent à MPSD d’effectuer la jonction lors de l’appel de mise à jour de la session.
- Lorsque vous avez terminé d’apporter des modifications locales, écrivez-les dans MPSD comme décrit dans la section Mettre à jour une session MPSD de cette rubrique.
-
Recevez de MPSD le nouvel objet
XblMultiplayerSessionHandle, dont de nombreux champs sont renseignés. - Utilisez maintenant le nouvel objet de session. Supprimez l’ancienne copie, qui contient une requête masquée de création d’une nouvelle session.
Exemple
API C plate- XAsyncBlock
- XblMultiplayerSessionCreateHandle
- XblMultiplayerSessionInitArgs
- XblMultiplayerSessionReference
- XblMultiplayerSessionWriteMode
- XblMultiplayerWriteSessionAsync
- XblMultiplayerWriteSessionResult
Définir un arbitre pour une session MPSD
Le titre suit la procédure suivante pour définir un arbitre pour une session déjà créée.Les jetons d’appareil des membres (hôtes potentiels) ne sont disponibles qu’une fois que les membres ont rejoint la session et inclus leurs adresses d’appareil sécurisées.
-
Récupérez auprès de MPSD les jetons d’appareil des candidats hôtes en appelant XblMultiplayerSessionMembers.
[!NOTE] Si la session a été créée par le matchmaking SmartMatch, vos clients peuvent utiliser les candidats hôtes disponibles auprès de MPSD en appelant XblMultiplayerSessionHostCandidates.
- Sélectionnez l’hôte souhaité dans la liste des candidats hôtes.
- Appelez XblMultiplayerSessionSetHostDeviceToken pour définir le jeton d’appareil dans le cache local de MPSD. Si l’appel de définition du jeton d’appareil hôte réussit, le jeton d’appareil local remplace le jeton de l’hôte.
-
Si un code d’état HTTP/412 est reçu lors de la tentative de définition du jeton d’appareil hôte, interrogez les données de session. Vérifiez si le jeton d’appareil hôte correspond à la console locale. Si ce n’est pas le cas, une autre console a été désignée comme arbitre.
[!NOTE] Votre client doit gérer le code d’état HTTP/412 séparément des autres codes HTTP, car HTTP/412 n’indique pas un échec standard. Pour plus d’informations sur ce code d’état, consultez Codes d’état des sessions multijoueurs.
-
Mettez à jour la session dans MPSD comme décrit dans la section Mettre à jour une session MPSD de cette rubrique.
[!NOTE] Si vous ne disposez pas d’un meilleur algorithme, le client peut implémenter un algorithme glouton dans lequel chaque candidat hôte tente de se définir comme hôte si personne d’autre ne l’a encore fait. Pour plus d’informations, consultez la section Arbitre de session de la rubrique Rubriques avancées sur les sessions multijoueurs.
Gérer l’activation du titre
XBOX One (ou version ultérieure) déclenche l’événementCoreApplicationView.Activated lors de l’activation par protocole.
Dans le contexte de l’API multijoueur, cet événement est déclenché lorsqu’un utilisateur accepte une invitation ou rejoint un autre utilisateur.
Ces actions déclenchent une activation à laquelle le titre doit réagir en faisant entrer l’utilisateur qui rejoint dans le jeu avec l’utilisateur cible.
Votre titre doit s’attendre à recevoir de nouveaux arguments d’activation à tout moment et ne doit jamais être codé en fonction de leur longueur.
-
Configurez un gestionnaire d’événements pour l’événement
CoreApplicationView.Activated. Ce gestionnaire se déclenche à chaque activation par protocole, même si le titre est déjà en cours d’exécution. - Lors de l’activation du titre, démarrez une session et abonnez-vous aux notifications de modification de session. Pour plus d’informations, consultez S’abonner aux notifications de modification de session MPSD dans cette rubrique.
- Faites rejoindre la session à l’utilisateur en tant que membre actif. Pour plus d’informations, consultez Rejoindre une session MPSD à partir d’une activation de titre dans cette rubrique.
- Définissez la session de lobby comme session d’activité exposée au moyen de l’interface utilisateur du profil. Pour plus d’informations, consultez Définir l’activité actuelle de l’utilisateur dans cette rubrique.
- Faites rejoindre la session de jeu à l’utilisateur en tant que membre actif. L’utilisateur peut maintenant se connecter aux pairs et entrer dans le jeu ou dans le lobby.

Rendre l’utilisateur joignable
Pour rendre l’utilisateur joignable, le titre doit procéder comme suit :- Créez un objet de session, puis modifiez les attributs selon les besoins.
- Faites rejoindre la session à l’utilisateur en tant que membre actif. Pour plus d’informations, consultez Rejoindre une session MPSD à partir d’une activation de titre dans cette rubrique.
- Déterminez si l’utilisateur a été désigné comme arbitre de la session.
- Si l’utilisateur n’est pas l’arbitre, passez à l’étape 7.
- Si l’utilisateur est l’arbitre, appelez XblMultiplayerSessionSetHostDeviceToken.
- Tentez d’écrire la session en appelant XblMultiplayerWriteSessionAsync.
- Définissez la session comme session active. Pour plus d’informations, consultez Définir l’activité actuelle de l’utilisateur dans cette rubrique.

Envoyer des invitations de jeu
Le titre peut permettre à un joueur d’envoyer des invitations de jeu des manières suivantes.- Envoyer les invitations pour la session de lobby.
- Envoyer les invitations à l’aide de l’interface utilisateur d’invitation générique de la plateforme XBOX, avec la référence de la session de jeu.
- Rendre la partie du joueur qui invite joignable. Pour plus d’informations, consultez Rendre l’utilisateur joignable dans cette rubrique.
- Déterminer si les invitations doivent être envoyées au moyen de la session de lobby ou à l’aide de l’interface utilisateur d’invitation.
- Si la session de lobby est utilisée, envoyer les invitations en appelant XblMultiplayerSendInvitesAsync. Cette méthode peut nécessiter la création d’une liste de joueurs dans l’interface du jeu en appelant XGameUiShowPlayerPickerAsync.
- Si l’interface utilisateur d’invitation est utilisée, appeler XGameUiShowSendGameInviteAsync pour afficher l’interface utilisateur d’invitation.
- Gérer XblMultiplayerAddSessionChangedHandler pour le joueur local une fois que le joueur distant a rejoint la session.
- Pour le joueur distant, implémenter un code d’activation de titre. Pour plus d’informations, consultez Gérer l’activation du titre dans cette rubrique.

Rejoindre une session de jeu à partir d’une session de lobby
Les sessions de jeu sur les appareils Windows 10 doivent avoir la fonctionnalitéuserAuthorizationStyle définie sur true s’il ne s’agit pas de grandes sessions. Par conséquent, la propriété joinRestriction ne peut pas être none, ce qui signifie que la session ne peut pas être directement joignable publiquement.
Un scénario courant consiste à créer une session de lobby pour rassembler des joueurs, puis à déplacer ces joueurs vers une session de jeu ou une session de matchmaking. Mais si la session de jeu n’est pas joignable publiquement, les clients du jeu ne peuvent pas la rejoindre, sauf s’ils respectent le paramètre joinRestriction. Dans la plupart des cas, ce paramètre est trop restrictif pour ce scénario.
La solution consiste à utiliser un handle de transfert pour lier la session de lobby et la session de jeu. Le titre peut procéder comme suit :
- Lorsque vous créez la session de jeu, utilisez l’API XblMultiplayerSetTransferHandleAsync pour créer un handle de transfert qui lie la session de lobby et la session de jeu.
- Stockez le GUID du handle de transfert dans la session de lobby au lieu de la référence de la session de jeu.
- Lorsque le titre souhaite déplacer des membres de la session de lobby vers la session de jeu, chaque client utilise le handle de transfert de la session de lobby pour rejoindre la session de jeu à l’aide de l’API XblMultiplayerWriteSessionByHandleAsync.
- MPSD consulte la session de lobby pour vérifier que les membres qui tentent de rejoindre la session de jeu à l’aide du handle de transfert se trouvent également dans la session de lobby.
- Si les membres se trouvent dans la session de lobby, ils peuvent accéder à la session de jeu.
Rejoindre une session MPSD à partir d’une activation de titre
Lorsqu’un utilisateur choisit de rejoindre l’activité d’un ami ou d’accepter une invitation à l’aide de l’interface utilisateur du shell XBOX, le titre est activé avec des paramètres qui indiquent quelle session l’utilisateur souhaite rejoindre. Le titre doit gérer cette activation et ajouter l’utilisateur à la session correspondante. Voici les étapes que le titre doit suivre.-
Implémentez un gestionnaire d’événements pour l’événement
CoreApplicationView.Activated. Il signale les activations du titre. -
Lorsque le gestionnaire se déclenche, examinez la propriété
IActivatedEventArgs.Kind. Si elle est définie surProtocol, effectuez un cast des arguments de l’événement vers la classeProtocolActivatedEventArgs. -
Examinez l’objet
ProtocolActivatedEventArgs. Si l’URI indiqué dans la propriétéProtocolActivatedEventArgs.Uricorrespond àinviteHandleAccept(invitation acceptée) ou àactivityHandleJoin(jonction au moyen de l’interface utilisateur du shell), analysez la chaîne de requête de l’URI. Elle est mise en forme comme une chaîne de requête d’URI normale avec des paires clé/valeur; extrayez les champs suivants.- Pour une invitation acceptée :
handleinvitedXuidsenderXuid
- Pour une jonction :
handlejoinerXuidjoineeXuid
- Pour une invitation acceptée :
- Démarrez le code multijoueur du titre, qui doit inclure un appel à XblMultiplayerSetSubscriptionsEnabled.
-
Créez un objet
XblMultiplayerSessionHandlelocal en appelant XblMultiplayerSessionCreateHandle. -
Appelez XblMultiplayerSessionJoin pour rejoindre la session. Utilisez les paramètres suivants afin que la jonction soit définie comme active.
memberCustomConstantsJson=nullinitializeRequested=falsejoinWithActiveStatus=true
- Appelez XblMultiplayerSessionSetSessionChangeSubscription pour recevoir un shoulder tap lorsque la session change après la jonction.
- Appelez XblMultiplayerWriteSessionByHandleAsync en utilisant le handle obtenu comme décrit à l’étape 3. L’utilisateur est maintenant membre de la session et peut utiliser les données de la session pour se connecter au jeu.
Définir l’activité actuelle de l’utilisateur
L’activité actuelle de l’utilisateur est affichée dans les expériences utilisateur du tableau de bord XBOX pour le titre. L’activité d’un utilisateur peut être définie au moyen d’une session ou au moyen de l’activation du titre. Dans ce dernier cas, l’utilisateur entre dans une session au moyen du matchmaking ou en démarrant une partie.L’activité définie au moyen d’une session peut être supprimée en appelant XblMultiplayerClearActivityAsync.
Mettre à jour une session MPSD
Lorsque votre titre met à jour une session existante à l’aide de l’API multijoueur, n’oubliez pas qu’il travaille sur une copie locale jusqu’à ce qu’il appelle l’écriture de la session.
- Apportez les modifications requises à la session actuelle, par exemple en appelant XblMultiplayerSessionLeave.
-
Une fois toutes les modifications apportées, écrivez les modifications locales dans MPSD à l’aide de l’une de ces méthodes.
Définissez le mode d’écriture sur XblMultiplayerSessionWriteMode
::SynchronizedUpdatesi vous écrivez dans une partie partagée que d’autres titres peuvent également modifier. Pour plus d’informations, consultez la section Synchronisation des mises à jour de session de la rubrique Vue d’ensemble de Multiplayer Session Directory. La méthode d’écriture écrit la jonction sur le serveur et obtient la dernière session, à partir de laquelle découvrir les autres membres de la session et les adresses d’appareil sécurisées (SDA) de leurs consoles. Pour plus d’informations sur l’établissement d’une connexion réseau entre ces consoles, consultez Introduction to Winsock on XBOX One. - Supprimez l’ancien objet de session local. Utilisez l’objet de session nouvellement récupéré afin que les actions futures reposent sur le dernier état connu de la session.
Quitter une session MPSD
Pour permettre à un utilisateur de quitter une session, le titre doit procéder comme suit :- Appelez XblMultiplayerSessionLeave pour la session de jeu.
- Mettez à jour la session de jeu dans MPSD comme décrit dans la section Mettre à jour une session MPSD de cette rubrique.
-
Si nécessaire, appelez la méthode
XblMultiplayerSessionLeavepour la session de lobby, puis mettez à jour cette session. - Si nécessaire pour la session de lobby, arrêtez l’API multijoueur en vous désinscrivant à l’aide d’appels à XblMultiplayerRemoveSubscriptionLostHandler et à XblMultiplayerRemoveSessionChangedHandler.

Remplir les emplacements de session libres pendant le matchmaking
Pour remplir les emplacements libres d’une session de ticket pendant le matchmaking, le titre doit suivre des étapes similaires aux suivantes :- Accédez au dernier état de session de la session de ticket créée pendant le matchmaking.
- Ajoutez les joueurs disponibles pour jouer à partir de la session de lobby.
- Déterminez si la session de ticket est pleine.
- Si la session est pleine, poursuivez la partie.
-
Si la session n’est pas encore pleine, créez le ticket de match comme décrit dans Créer un ticket de match dans cette rubrique. Assurez-vous de créer le ticket avec le paramètre
preserveSessiondéfini surAlways. - Poursuivez le matchmaking. Pour plus d’informations, consultez Vue d’ensemble du matchmaking.

Créer un ticket de match
Pour créer un ticket de match, l’éclaireur de matchmaking doit procéder comme suit :-
Appelez XblMatchmakingCreateMatchTicketAsync en transmettant une référence à la session de ticket. La méthode lit la session de ticket dans MPSD et démarre le matchmaking pour les utilisateurs de la session. En interne, la méthode appelle
POST (/serviceconfigs/{scid}/hoppers/{hoppername}). -
Définissez le paramètre
preserveSessionsurNeversi le service de matchmaking doit associer les membres de la session dans une nouvelle session ou dans une autre session existante. Définissez le paramètrepreserveSessionsurAlwayspour permettre au titre de réutiliser une session de jeu existante comme session de ticket afin de poursuivre la partie. Le service de matchmaking peut alors garantir que la session soumise est conservée et que les joueurs associés sont ajoutés à cette session. -
Utilisez XblCreateMatchTicketResponse
::EstimatedWaitTime, retourné dans l’objetCreateMatchTicketResponse, pour informer les utilisateurs de la durée attendue du matchmaking. -
Utilisez XblCreateMatchTicketResponse
::MatchTicketId, retourné dans l’objet de réponse, pour annuler le matchmaking de la session si nécessaire, en supprimant le ticket. La suppression du ticket utilise XblMatchmakingDeleteMatchTicketAsync.
Obtenir l’état d’un ticket de match
Votre titre doit procéder comme suit pour récupérer l’état d’un ticket de match.-
Obtenez l’objet
XblMultiplayerSessionHandlede la session de ticket. - Appelez XblMultiplayerSessionMatchmakingServer pour accéder à l’objet XblMultiplayerMatchmakingServer utilisé lors du matchmaking.
-
Vérifiez l’objet
XblMultiplayerMatchmakingServerpour déterminer l’état du processus de matchmaking, le temps d’attente habituel pour la session et la référence de la session cible, si un match a été trouvé.
