Passer au contenu principal
Cette rubrique décrit comment implémenter des tâches spécifiques liées à l’utilisation de Multiplayer 2015. Cette rubrique couvre les points suivants :

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.
Pour recevoir les notifications de modification de session MPSD, le titre peut suivre la procédure suivante.
  1. Utilisez le même objet XblContextHandle pour 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 objet XblContextHandle distinct pour chaque utilisateur.
  2. Implémentez des gestionnaires d’événements pour XblMultiplayerAddSessionChangedHandler et XblMultiplayerSessionSubscriptionLostHandler.
  3. Si vous vous abonnez aux modifications pour plusieurs utilisateurs, ajoutez du code à votre gestionnaire d’événements XblMultiplayerAddSessionChangedHandler pour éviter un travail inutile. Utilisez la propriété XblMultiplayerSessionChangeEventArgs::Branch et 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.
  4. Appelez XblMultiplayerSetSubscriptionsEnabled pour autoriser les abonnements.
  5. Créez un objet de session local, puis rejoignez cette session en tant que membre actif.
  6. Appelez XblMultiplayerAddSessionChangedHandler pour chaque utilisateur, en transmettant le type de modification de session pour lequel vous souhaitez être notifié.
  7. Écrivez la session dans MPSD comme décrit dans la section Mettre à jour une session MPSD de cette rubrique.
L’organigramme suivant montre comment démarrer le multijoueur en s’abonnant aux événements décrits dans la procédure précédente. Image d'un organigramme montrant comment démarrer le multijoueur en s'abonnant aux événements décrits dans la procédure précédente.

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és Branch 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é ChangeNumber pour chaque valeur de la propriété Branch évaluée.
  • Si un shoulder tap a une valeur de propriété ChangeNumber supé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é ChangeNumber supé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.
Retour en haut de cette rubrique.

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.
Le titre doit procéder comme suit pour créer une nouvelle session.
  1. 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.
  2. Créez un nouveau XblMultiplayerSessionHandle avec XblMultiplayerSessionCreateHandle pour préparer toutes les données de session dont MPSD a besoin pour créer une nouvelle session.
  3. 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.
  4. 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.
  5. Recevez de MPSD le nouvel objet XblMultiplayerSessionHandle, dont de nombreux champs sont renseignés.
  6. 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
Pour plus d’informations, consultez les rubriques suivantes : Retour en haut de cette rubrique.

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.
  1. 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.
  2. Sélectionnez l’hôte souhaité dans la liste des candidats hôtes.
  3. 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.
  4. 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.
  5. 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.
Retour en haut de cette rubrique.

Gérer l’activation du titre

XBOX One (ou version ultérieure) déclenche l’événement CoreApplicationView.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.
Le titre doit effectuer les principales étapes suivantes pour gérer l’activation du titre.
  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
L’organigramme suivant montre comment gérer l’activation du titre. Image d'un organigramme montrant comment gérer l'activation du titre. Retour en haut de cette rubrique.

Rendre l’utilisateur joignable

Pour rendre l’utilisateur joignable, le titre doit procéder comme suit :
  1. Créez un objet de session, puis modifiez les attributs selon les besoins.
  2. 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.
  3. Déterminez si l’utilisateur a été désigné comme arbitre de la session.
  4. Si l’utilisateur n’est pas l’arbitre, passez à l’étape 7.
  5. Si l’utilisateur est l’arbitre, appelez XblMultiplayerSessionSetHostDeviceToken.
  6. Tentez d’écrire la session en appelant XblMultiplayerWriteSessionAsync.
  7. Définissez la session comme session active. Pour plus d’informations, consultez Définir l’activité actuelle de l’utilisateur dans cette rubrique.
L’organigramme suivant montre les étapes permettant à un utilisateur d’être rejoint par d’autres joueurs pendant une partie. Image d'un organigramme montrant les étapes permettant à un utilisateur d'être rejoint par d'autres joueurs pendant une partie. Retour en haut de 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.
Pour envoyer des invitations de jeu pour un joueur, le titre doit procéder comme suit :
  1. Rendre la partie du joueur qui invite joignable. Pour plus d’informations, consultez Rendre l’utilisateur joignable dans cette rubrique.
  2. 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.
  3. 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.
  4. Si l’interface utilisateur d’invitation est utilisée, appeler XGameUiShowSendGameInviteAsync pour afficher l’interface utilisateur d’invitation.
  5. Gérer XblMultiplayerAddSessionChangedHandler pour le joueur local une fois que le joueur distant a rejoint la session.
  6. 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.
L’organigramme suivant montre comment envoyer des invitations. Image d'un organigramme montrant comment envoyer des invitations. Retour en haut de 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 :
  1. 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.
  2. Stockez le GUID du handle de transfert dans la session de lobby au lieu de la référence de la session de jeu.
  3. 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.
  4. 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.
  5. Si les membres se trouvent dans la session de lobby, ils peuvent accéder à la session de jeu.
Retour en haut de cette rubrique.

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.
  1. Implémentez un gestionnaire d’événements pour l’événement CoreApplicationView.Activated. Il signale les activations du titre.
  2. Lorsque le gestionnaire se déclenche, examinez la propriété IActivatedEventArgs.Kind. Si elle est définie sur Protocol, effectuez un cast des arguments de l’événement vers la classe ProtocolActivatedEventArgs.
  3. Examinez l’objet ProtocolActivatedEventArgs. Si l’URI indiqué dans la propriété ProtocolActivatedEventArgs.Uri correspond à 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 :
      1. handle
      2. invitedXuid
      3. senderXuid
    • Pour une jonction :
      1. handle
      2. joinerXuid
      3. joineeXuid
  4. Démarrez le code multijoueur du titre, qui doit inclure un appel à XblMultiplayerSetSubscriptionsEnabled.
  5. Créez un objet XblMultiplayerSessionHandle local en appelant XblMultiplayerSessionCreateHandle.
  6. Appelez XblMultiplayerSessionJoin pour rejoindre la session. Utilisez les paramètres suivants afin que la jonction soit définie comme active.
    • memberCustomConstantsJson = null
    • initializeRequested = false
    • joinWithActiveStatus = true
  7. Appelez XblMultiplayerSessionSetSessionChangeSubscription pour recevoir un shoulder tap lorsque la session change après la jonction.
  8. 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.
Retour en haut de cette rubrique.

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.
Pour définir une session comme activité actuelle de l’utilisateur, le titre appelle XblMultiplayerSetActivityAsync. Il transmet la référence de la session. Pour définir l’activité actuelle de l’utilisateur au moyen de l’activation du titre, consultez Rejoindre une session MPSD à partir d’une activation de titre dans cette rubrique. Retour en haut de cette rubrique.

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.
Pour mettre à jour une session existante, le titre doit procéder comme suit :
  1. Apportez les modifications requises à la session actuelle, par exemple en appelant XblMultiplayerSessionLeave.
  2. 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::SynchronizedUpdate si 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.
  3. 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.
Retour en haut de cette rubrique.

Quitter une session MPSD

Pour permettre à un utilisateur de quitter une session, le titre doit procéder comme suit :
  1. Appelez XblMultiplayerSessionLeave pour la session de jeu.
  2. Mettez à jour la session de jeu dans MPSD comme décrit dans la section Mettre à jour une session MPSD de cette rubrique.
  3. Si nécessaire, appelez la méthode XblMultiplayerSessionLeave pour la session de lobby, puis mettez à jour cette session.
  4. Si nécessaire pour la session de lobby, arrêtez l’API multijoueur en vous désinscrivant à l’aide d’appels à XblMultiplayerRemoveSubscriptionLostHandler et à XblMultiplayerRemoveSessionChangedHandler.
L’organigramme suivant montre comment quitter la session et arrêter le multijoueur. Image d'un organigramme montrant comment quitter la session et arrêter le multijoueur. Retour en haut de cette rubrique.

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 :
  1. Accédez au dernier état de session de la session de ticket créée pendant le matchmaking.
  2. Ajoutez les joueurs disponibles pour jouer à partir de la session de lobby.
  3. Déterminez si la session de ticket est pleine.
  4. Si la session est pleine, poursuivez la partie.
  5. 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 preserveSession défini sur Always.
  6. Poursuivez le matchmaking. Pour plus d’informations, consultez Vue d’ensemble du matchmaking.
L’organigramme suivant montre comment remplir les emplacements de session libres pendant le matchmaking. Image d'un organigramme montrant comment remplir les emplacements de session libres pendant le matchmaking. Retour en haut de cette rubrique.

Créer un ticket de match

Pour créer un ticket de match, l’éclaireur de matchmaking doit procéder comme suit :
  1. 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}).
  2. Définissez le paramètre preserveSession sur Never si 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ètre preserveSession sur Always pour 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.
  3. Utilisez XblCreateMatchTicketResponse::EstimatedWaitTime, retourné dans l’objet CreateMatchTicketResponse, pour informer les utilisateurs de la durée attendue du matchmaking.
  4. 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.
Retour en haut de cette rubrique.

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.
  1. Obtenez l’objet XblMultiplayerSessionHandle de la session de ticket.
  2. Appelez XblMultiplayerSessionMatchmakingServer pour accéder à l’objet XblMultiplayerMatchmakingServer utilisé lors du matchmaking.
  3. Vérifiez l’objet XblMultiplayerMatchmakingServer pour 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é.
Dernière modification le 8 octobre 2026