- Suscribirse a las notificaciones de cambios de sesión de Multiplayer Session Directory (MPSD)
- Crear una sesión de MPSD
- Establecer un árbitro para una sesión de MPSD
- Administrar la activación del título
- Hacer que el usuario admita uniones
- Enviar invitaciones de juego
- Unirse a una sesión de juego desde una sesión de sala de espera
- Unirse a una sesión de MPSD desde una activación del título
- Establecer la actividad actual del usuario
- Actualizar una sesión de MPSD
- Abandonar una sesión de MPSD
- Rellenar los espacios abiertos de la sesión durante el emparejamiento
- Crear un vale de partida
- Obtener el estado del vale de partida
Suscribirse a las notificaciones de cambios de sesión de Multiplayer Session Directory (MPSD)
Suscribirse a los cambios de una sesión requiere que el jugador asociado esté activo en la sesión. El campo
connectionRequiredForActiveMembers también debe establecerse en true en el objeto /constants/system/capabilities de la sesión. Este campo suele establecerse en la plantilla de sesión. Para obtener más información, consulte Plantillas de sesión multijugador e Información general de Multiplayer Session Directory.-
Use el mismo objeto
XblContextHandlepara todas las llamadas del mismo usuario. Las suscripciones están vinculadas a la duración de este objeto. Si hay varios usuarios locales, use un objetoXblContextHandledistinto para cada usuario. - Implemente controladores de eventos para XblMultiplayerAddSessionChangedHandler y XblMultiplayerSessionSubscriptionLostHandler.
-
Si se suscribe a los cambios de más de un usuario, agregue código a su controlador de eventos
XblMultiplayerAddSessionChangedHandlerpara evitar trabajo innecesario. Use la propiedad XblMultiplayerSessionChangeEventArgs::Branchy la propiedad XblMultiplayerSessionChangeEventArgs::ChangeNumber. El uso de estas propiedades le permite hacer un seguimiento del último cambio visto e ignorar los cambios más antiguos. - Llame a XblMultiplayerSetSubscriptionsEnabled para permitir las suscripciones.
- Cree un objeto de sesión local y, a continuación, únase a esa sesión como activo.
-
Realice llamadas para cada usuario a
XblMultiplayerAddSessionChangedHandler, pasando el tipo de cambio de sesión sobre el que se debe notificar. - Escriba la sesión en MPSD como se describe en la sección Actualizar una sesión de MPSD de este tema.
Análisis de notificaciones de cambios de sesión duplicadas
Cuando hay varios usuarios suscritos a las notificaciones de la misma sesión, cada cambio en esa sesión desencadena un aviso (“shoulder tap”) para cada usuario. Todos estos avisos, excepto uno, son duplicados. Aunque seguimos recomendando que un título suscriba a las notificaciones a todos los usuarios de una sesión, un título debe ignorar los cambios de los que ya se le ha notificado. Puede hacerlo mediante las propiedadesBranch y ChangeNumber.
Para detectar varios avisos, un título debe hacer lo siguiente:
-
Almacenar el valor más reciente de la propiedad
ChangeNumberpara cada valor evaluado de la propiedadBranch. -
Si un aviso tiene un valor de la propiedad
ChangeNumbermayor que el último valor almacenado para ese valor de la propiedadBranch, procesar el aviso y, a continuación, actualizar el valor más reciente de la propiedadChangeNumber. -
Si un aviso no tiene un valor de la propiedad
ChangeNumbermayor para ese valor de la propiedadBranch, omitir el procesamiento del aviso. Ese cambio de sesión ya se ha controlado.
Los valores de la propiedad
ChangeNumber deben seguirse por los valores de la propiedad Branch, no por sesión. El valor de la propiedad Branch puede cambiar, restableciendo el valor de la propiedad ChangeNumber, durante la vida de una sesión.Crear una sesión de MPSD
De forma predeterminada, una sesión de MPSD se crea cuando el primer miembro se une a ella. Si la lógica de su título espera que el título exista o no exista en el momento de la unión, puede pasar un valor de modo de escritura adecuado al método de escritura durante la actualización de la sesión.
-
Cree un objeto
XblContextHandlenuevo. Su título crea este objeto una vez, lo almacena y lo reutiliza según sea necesario en todo el código fuente. Es necesario usar exactamente el mismo contexto, especialmente al trabajar con suscripciones de sesión. -
Cree un
XblMultiplayerSessionHandlenuevo con XblMultiplayerSessionCreateHandle para preparar todos los datos de sesión que MPSD necesita para crear una sesión nueva. - Realice los cambios necesarios antes de escribir la sesión en MPSD. Por ejemplo, al unir a un miembro a la sesión con una llamada a XblMultiplayerSessionJoin, el cliente agrega datos de solicitud locales ocultos que indican a MPSD que realice la unión cuando se llame a actualizar la sesión.
- Cuando termine de realizar los cambios locales, escríbalos en MPSD como se describe en la sección Actualizar una sesión de MPSD de este tema.
-
Reciba el nuevo objeto
XblMultiplayerSessionHandlede MPSD, con muchos campos rellenados. - Use el nuevo objeto de sesión de ahí en adelante. Descarte la copia antigua, que contiene una solicitud oculta para crear una sesión nueva.
Ejemplo
API de C plana- XAsyncBlock
- XblMultiplayerSessionCreateHandle
- XblMultiplayerSessionInitArgs
- XblMultiplayerSessionReference
- XblMultiplayerSessionWriteMode
- XblMultiplayerWriteSessionAsync
- XblMultiplayerWriteSessionResult
Establecer un árbitro para una sesión de MPSD
El título usa el procedimiento siguiente para establecer un árbitro para una sesión que ya se ha creado.Los tokens de dispositivo de los miembros (posibles hosts) no están disponibles hasta que los miembros se han unido a la sesión y han incluido sus direcciones seguras de dispositivo.
-
Recupere de MPSD los tokens de dispositivo de los candidatos a host llamando a XblMultiplayerSessionMembers.
[!NOTE] Si la sesión la creó el emparejamiento de SmartMatch, sus clientes pueden usar los candidatos a host disponibles en MPSD llamando a XblMultiplayerSessionHostCandidates.
- Seleccione el host requerido en la lista de candidatos a host.
- Llame a XblMultiplayerSessionSetHostDeviceToken para establecer el token de dispositivo en la caché local de MPSD. Si la llamada para establecer el token de dispositivo del host se realiza correctamente, el token de dispositivo local reemplaza al token del host.
-
Si se recibe un código de estado HTTP/412 al intentar establecer el token de dispositivo del host, consulte los datos de la sesión. Compruebe si el token de dispositivo del host corresponde a la consola local. Si no corresponde a la consola local, se ha designado otra consola como árbitro.
[!NOTE] Su cliente debe controlar el código de estado HTTP/412 por separado de otros códigos HTTP porque HTTP/412 no indica un error estándar. Para obtener más información sobre este código de estado, consulte Códigos de estado de sesión multijugador.
-
Actualice la sesión en MPSD como se describe en la sección Actualizar una sesión de MPSD de este tema.
[!NOTE] Si no dispone de un algoritmo mejor, el cliente puede implementar un algoritmo voraz en el que cada candidato a host intenta establecerse a sí mismo como host si nadie más lo ha hecho todavía. Para obtener más información, consulte la sección Árbitro de la sesión en el tema Temas avanzados de sesión multijugador.
Administrar la activación del título
XBOX One (o posterior) desencadena el eventoCoreApplicationView.Activated durante la activación por protocolo.
En el contexto de la API multijugador, este evento se desencadena cuando un usuario acepta una invitación o se une a otro usuario.
Estas acciones desencadenan una activación a la que el título debe reaccionar llevando al usuario que se une al juego con el usuario de destino.
Su título debe esperar nuevos argumentos de activación en cualquier momento y nunca debe codificarse en función de la longitud.
-
Configure un controlador de eventos para el evento
CoreApplicationView.Activated. Este controlador se desencadena cada vez que se produce una activación por protocolo, incluso si el título ya se está ejecutando. - Al activarse el título, inicie una sesión y suscríbase a las notificaciones de cambios de sesión. Para obtener más información, consulte Suscribirse a las notificaciones de cambios de sesión de MPSD en este tema.
- Una al usuario a la sesión como activo. Para obtener más información, consulte Unirse a una sesión de MPSD desde una activación del título en este tema.
- Establezca la sesión de sala de espera como la sesión de actividad que se expone a través de la interfaz de usuario del perfil. Para obtener más información, consulte Establecer la actividad actual del usuario en este tema.
- Una al usuario a la sesión de juego como activo. El usuario ahora puede conectarse a otros pares y entrar en el juego o en la sala de espera.
Hacer que el usuario admita uniones
Para hacer que el usuario admita uniones, el título debe hacer lo siguiente:- Cree un objeto de sesión y, a continuación, modifique los atributos según sea necesario.
- Una al usuario a la sesión como activo. Para obtener más información, consulte Unirse a una sesión de MPSD desde una activación del título en este tema.
- Determine si el usuario ha sido designado como árbitro de la sesión.
- Si el usuario no es el árbitro, vaya al paso 7.
- Si el usuario es el árbitro, llame a XblMultiplayerSessionSetHostDeviceToken.
- Intente escribir la sesión mediante una llamada a XblMultiplayerWriteSessionAsync.
- Establezca la sesión como la sesión activa. Para obtener más información, consulte Establecer la actividad actual del usuario en este tema.
Enviar invitaciones de juego
El título puede permitir que un jugador envíe invitaciones de juego de las maneras siguientes.- Enviar las invitaciones para la sesión de sala de espera.
- Enviar las invitaciones mediante la interfaz de usuario de invitaciones genérica de la plataforma XBOX con la referencia de la sesión de juego.
- Haga que el jugador que invita admita uniones. Para obtener más información, consulte Hacer que el usuario admita uniones en este tema.
- Determine si las invitaciones se van a enviar a través de la sesión de sala de espera o mediante la interfaz de usuario de invitaciones.
- Si se usa la sesión de sala de espera, envíe las invitaciones mediante una llamada a XblMultiplayerSendInvitesAsync. Este método podría requerir la creación de una lista de jugadores en la interfaz de usuario del juego llamando a XGameUiShowPlayerPickerAsync.
- Si se usa la interfaz de usuario de invitaciones, llame a XGameUiShowSendGameInviteAsync para mostrar la interfaz de usuario de invitaciones.
- Controle el XblMultiplayerAddSessionChangedHandler para el jugador local después de que el jugador remoto se una.
- Para el jugador remoto, implemente código de activación del título. Para obtener más información, consulte Administrar la activación del título en este tema.
Unirse a una sesión de juego desde una sesión de sala de espera
Las sesiones de juego en dispositivos Windows 10 deben tener la funcionalidaduserAuthorizationStyle establecida en true si no son sesiones grandes. Como resultado, la propiedad joinRestriction no puede ser none, lo que significa que la sesión no puede admitir uniones públicas directamente.
Un escenario común consiste en crear una sesión de sala de espera para reunir a los jugadores y, a continuación, mover a esos jugadores a una sesión de juego o a una sesión de emparejamiento. Pero si la sesión de juego no admite uniones públicas, los clientes del juego no pueden unirse a la sesión de juego a menos que cumplan la configuración de joinRestriction. En la mayoría de los casos, es demasiado restrictivo para este escenario.
La solución es usar un identificador de transferencia para vincular la sesión de sala de espera y la sesión de juego. El título puede lograrlo haciendo lo siguiente:
- Cuando cree la sesión de juego, use la API XblMultiplayerSetTransferHandleAsync para crear un identificador de transferencia que vincule la sesión de sala de espera y la sesión de juego.
- Almacene el GUID del identificador de transferencia en la sesión de sala de espera en lugar de la referencia de sesión de la sesión de juego.
- Cuando el título quiera mover miembros de la sesión de sala de espera a la sesión de juego, cada cliente usa el identificador de transferencia de la sesión de sala de espera para unirse a la sesión de juego mediante la API XblMultiplayerWriteSessionByHandleAsync.
- MPSD busca la sesión de sala de espera para comprobar que los miembros que intentan unirse a la sesión de juego mediante el identificador de transferencia también están en la sesión de sala de espera.
- Si los miembros están en la sesión de sala de espera, pueden acceder a la sesión de juego.
Unirse a una sesión de MPSD desde una activación del título
Cuando un usuario elige unirse a la actividad de un amigo o aceptar una invitación mediante la interfaz de usuario del shell de XBOX, el título se activa con parámetros que indican a qué sesión quiere unirse el usuario. El título debe controlar esta activación y agregar al usuario a la sesión correspondiente. Estos son los pasos que debe seguir el título.-
Implemente un controlador de eventos para el evento
CoreApplicationView.Activated. Notifica las activaciones del título. -
Cuando el controlador se desencadene, examine la propiedad
IActivatedEventArgs.Kind. Si está establecida enProtocol, convierta los argumentos del evento a la claseProtocolActivatedEventArgs. -
Examine el objeto
ProtocolActivatedEventArgs. Si el URI indicado en la propiedadProtocolActivatedEventArgs.Uricoincide coninviteHandleAccept(correspondiente a una invitación aceptada) o conactivityHandleJoin(correspondiente a una unión a través de la interfaz de usuario del shell), analice la cadena de consulta del URI. Tiene el formato de una cadena de consulta de URI normal con pares clave/valor, extrayendo los campos siguientes.- Para una invitación aceptada:
handleinvitedXuidsenderXuid
- Para una unión:
handlejoinerXuidjoineeXuid
- Para una invitación aceptada:
- Inicie el código multijugador del título, que debe incluir una llamada a XblMultiplayerSetSubscriptionsEnabled.
-
Cree un objeto
XblMultiplayerSessionHandlelocal llamando a XblMultiplayerSessionCreateHandle. -
Llame a XblMultiplayerSessionJoin para unirse a la sesión. Use la configuración de parámetros siguiente para que la unión se establezca como activa.
memberCustomConstantsJson=nullinitializeRequested=falsejoinWithActiveStatus=true
- Llame a XblMultiplayerSessionSetSessionChangeSubscription para recibir un aviso cuando la sesión cambie después de la unión.
- Llame a XblMultiplayerWriteSessionByHandleAsync con el identificador adquirido como se describe en el paso 3. El usuario es ahora miembro de la sesión y puede usar los datos de la sesión para conectarse al juego.
Establecer la actividad actual del usuario
La actividad actual del usuario se muestra en las experiencias de usuario del panel de XBOX para el título. La actividad de un usuario se puede establecer a través de una sesión o a través de la activación del título. En este último caso, el usuario entra en una sesión mediante el emparejamiento o al iniciar un juego.La actividad establecida a través de una sesión se puede eliminar llamando a XblMultiplayerClearActivityAsync.
Actualizar una sesión de MPSD
Cuando su título actualiza una sesión existente mediante la API multijugador, recuerde que trabaja con una copia local hasta que realiza una llamada para escribir la sesión.
- Realice los cambios necesarios en la sesión actual, por ejemplo, llamando a XblMultiplayerSessionLeave.
-
Cuando haya realizado todos los cambios, escriba los cambios locales en MPSD mediante cualquiera de estos métodos.
Establezca el modo de escritura en XblMultiplayerSessionWriteMode
::SynchronizedUpdatesi escribe en una parte compartida que otros títulos también pueden modificar. Para obtener más información, consulte la sección Sincronización de las actualizaciones de sesión en el tema Información general de Multiplayer Session Directory. El método de escritura escribe la unión en el servidor y obtiene la sesión más reciente, a partir de la cual se pueden descubrir los demás miembros de la sesión y las direcciones seguras de dispositivo (SDA) de sus consolas. Para obtener más información sobre cómo establecer una conexión de red entre estas consolas, consulte Introducción a Winsock en XBOX One. - Descarte el objeto de sesión local antiguo. Use el objeto de sesión recién recuperado para que las acciones futuras se basen en el estado de sesión más reciente conocido.
Abandonar una sesión de MPSD
Para permitir que un usuario abandone una sesión, el título debe hacer lo siguiente:- Llame a XblMultiplayerSessionLeave para la sesión de juego.
- Actualice la sesión de juego en MPSD como se describe en la sección Actualizar una sesión de MPSD de este tema.
-
Si es necesario, llame al método
XblMultiplayerSessionLeavepara la sesión de sala de espera y, a continuación, actualice esa sesión. - Si es necesario para la sesión de sala de espera, cierre la API multijugador anulando el registro mediante llamadas a XblMultiplayerRemoveSubscriptionLostHandler y XblMultiplayerRemoveSessionChangedHandler.
Rellenar los espacios abiertos de la sesión durante el emparejamiento
Para rellenar los espacios abiertos de una sesión de vale durante el emparejamiento, el título debe seguir pasos similares a los siguientes:- Acceda al estado de sesión más reciente de la sesión de vale que se creó durante el emparejamiento.
- Agregue jugadores disponibles para el juego desde la sesión de sala de espera.
- Determine si la sesión de vale está llena.
- Si la sesión está llena, continúe con el juego.
-
Si la sesión aún no está llena, cree el vale de partida como se describe en Crear un vale de partida en este tema. Asegúrese de crear el vale con el parámetro
preserveSessionestablecido enAlways. - Continúe con el emparejamiento. Para obtener más información, consulte Información general del emparejamiento.
Crear un vale de partida
Para crear un vale de partida, el explorador (scout) de emparejamiento debe hacer lo siguiente:-
Llame a XblMatchmakingCreateMatchTicketAsync, pasando una referencia a la sesión de vale. El método lee la sesión de vale de MPSD e inicia el emparejamiento para los usuarios de la sesión. Internamente, el método llama a
POST (/serviceconfigs/{scid}/hoppers/{hoppername}). -
Establezca el parámetro
preserveSessionenNeversi el servicio de emparejamiento debe emparejar a los miembros de la sesión en una sesión nueva u otra sesión existente. Establezca el parámetropreserveSessionenAlwayspara permitir que el título reutilice una sesión de juego existente como sesión de vale para continuar el juego. El servicio de emparejamiento puede entonces garantizar que la sesión enviada se conserve y que los jugadores emparejados se agreguen a esa sesión. -
Use XblCreateMatchTicketResponse
::EstimatedWaitTime, que se devuelve en el objetoCreateMatchTicketResponse, para establecer las expectativas del usuario sobre el tiempo de emparejamiento. -
Use XblCreateMatchTicketResponse
::MatchTicketId, que se devuelve en el objeto de respuesta, para cancelar el emparejamiento de la sesión, si es necesario, eliminando el vale. La eliminación del vale usa XblMatchmakingDeleteMatchTicketAsync.
Obtener el estado del vale de partida
Su título debe hacer lo siguiente para recuperar el estado del vale de partida.-
Obtenga el objeto
XblMultiplayerSessionHandlede la sesión de vale. - Llame a XblMultiplayerSessionMatchmakingServer para acceder al objeto XblMultiplayerMatchmakingServer que se usó en el emparejamiento.
-
Compruebe el objeto
XblMultiplayerMatchmakingServerpara determinar el estado del proceso de emparejamiento, el tiempo de espera típico de la sesión y la referencia de la sesión de destino, si se ha encontrado una coincidencia.
