Skip to main content
En este tema se describe cómo implementar tareas específicas relacionadas con el uso de Multijugador 2015. Este tema trata lo siguiente:

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.
Para recibir notificaciones de cambios de sesión de MPSD, el título puede usar el procedimiento siguiente.
  1. Use el mismo objeto XblContextHandle para 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 objeto XblContextHandle distinto para cada usuario.
  2. Implemente controladores de eventos para XblMultiplayerAddSessionChangedHandler y XblMultiplayerSessionSubscriptionLostHandler.
  3. Si se suscribe a los cambios de más de un usuario, agregue código a su controlador de eventos XblMultiplayerAddSessionChangedHandler para evitar trabajo innecesario. Use la propiedad XblMultiplayerSessionChangeEventArgs::Branch y 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.
  4. Llame a XblMultiplayerSetSubscriptionsEnabled para permitir las suscripciones.
  5. Cree un objeto de sesión local y, a continuación, únase a esa sesión como activo.
  6. Realice llamadas para cada usuario a XblMultiplayerAddSessionChangedHandler, pasando el tipo de cambio de sesión sobre el que se debe notificar.
  7. Escriba la sesión en MPSD como se describe en la sección Actualizar una sesión de MPSD de este tema.
El diagrama de flujo siguiente muestra cómo iniciar el modo multijugador suscribiéndose a los eventos que se describen en el procedimiento anterior.

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 propiedades Branch y ChangeNumber. Para detectar varios avisos, un título debe hacer lo siguiente:
  • Almacenar el valor más reciente de la propiedad ChangeNumber para cada valor evaluado de la propiedad Branch.
  • Si un aviso tiene un valor de la propiedad ChangeNumber mayor que el último valor almacenado para ese valor de la propiedad Branch, procesar el aviso y, a continuación, actualizar el valor más reciente de la propiedad ChangeNumber.
  • Si un aviso no tiene un valor de la propiedad ChangeNumber mayor para ese valor de la propiedad Branch, 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.
Volver al principio de este tema.

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.
El título debe hacer lo siguiente para crear una sesión nueva.
  1. Cree un objeto XblContextHandle nuevo. 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.
  2. Cree un XblMultiplayerSessionHandle nuevo con XblMultiplayerSessionCreateHandle para preparar todos los datos de sesión que MPSD necesita para crear una sesión nueva.
  3. 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.
  4. 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.
  5. Reciba el nuevo objeto XblMultiplayerSessionHandle de MPSD, con muchos campos rellenados.
  6. 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
Para obtener más información, consulte lo siguiente: Volver al principio de este tema.

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.
  1. 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.
  2. Seleccione el host requerido en la lista de candidatos a host.
  3. 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.
  4. 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.
  5. 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.
Volver al principio de este tema.

Administrar la activación del título

XBOX One (o posterior) desencadena el evento CoreApplicationView.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.
El título debe realizar los pasos principales siguientes para controlar la activación del título.
  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
El diagrama de flujo siguiente muestra cómo controlar la activación del título. Volver al principio de este tema.

Hacer que el usuario admita uniones

Para hacer que el usuario admita uniones, el título debe hacer lo siguiente:
  1. Cree un objeto de sesión y, a continuación, modifique los atributos según sea necesario.
  2. 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.
  3. Determine si el usuario ha sido designado como árbitro de la sesión.
  4. Si el usuario no es el árbitro, vaya al paso 7.
  5. Si el usuario es el árbitro, llame a XblMultiplayerSessionSetHostDeviceToken.
  6. Intente escribir la sesión mediante una llamada a XblMultiplayerWriteSessionAsync.
  7. 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.
El diagrama de flujo siguiente muestra los pasos para permitir que otros jugadores se unan a un usuario durante un juego. Volver al principio de 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.
Para enviar invitaciones de juego en nombre de un jugador, el título debe hacer lo siguiente:
  1. Haga que el jugador que invita admita uniones. Para obtener más información, consulte Hacer que el usuario admita uniones en este tema.
  2. 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.
  3. 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.
  4. Si se usa la interfaz de usuario de invitaciones, llame a XGameUiShowSendGameInviteAsync para mostrar la interfaz de usuario de invitaciones.
  5. Controle el XblMultiplayerAddSessionChangedHandler para el jugador local después de que el jugador remoto se una.
  6. 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.
El diagrama de flujo siguiente muestra cómo enviar invitaciones. Volver al principio de 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 funcionalidad userAuthorizationStyle 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:
  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. Si los miembros están en la sesión de sala de espera, pueden acceder a la sesión de juego.
Volver al principio de este tema.

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.
  1. Implemente un controlador de eventos para el evento CoreApplicationView.Activated. Notifica las activaciones del título.
  2. Cuando el controlador se desencadene, examine la propiedad IActivatedEventArgs.Kind. Si está establecida en Protocol, convierta los argumentos del evento a la clase ProtocolActivatedEventArgs.
  3. Examine el objeto ProtocolActivatedEventArgs. Si el URI indicado en la propiedad ProtocolActivatedEventArgs.Uri coincide con inviteHandleAccept (correspondiente a una invitación aceptada) o con activityHandleJoin (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:
      1. handle
      2. invitedXuid
      3. senderXuid
    • Para una unión:
      1. handle
      2. joinerXuid
      3. joineeXuid
  4. Inicie el código multijugador del título, que debe incluir una llamada a XblMultiplayerSetSubscriptionsEnabled.
  5. Cree un objeto XblMultiplayerSessionHandle local llamando a XblMultiplayerSessionCreateHandle.
  6. 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 = null
    • initializeRequested = false
    • joinWithActiveStatus = true
  7. Llame a XblMultiplayerSessionSetSessionChangeSubscription para recibir un aviso cuando la sesión cambie después de la unión.
  8. 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.
Volver al principio de este tema.

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.
Para establecer una sesión como la actividad actual del usuario, el título llama a XblMultiplayerSetActivityAsync. Pasa la referencia de sesión de la sesión. Para establecer la actividad actual del usuario a través de la activación del título, consulte Unirse a una sesión de MPSD desde una activación del título en este tema. Volver al principio de este tema.

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.
Para actualizar una sesión existente, el título debe hacer lo siguiente:
  1. Realice los cambios necesarios en la sesión actual, por ejemplo, llamando a XblMultiplayerSessionLeave.
  2. 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::SynchronizedUpdate si 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.
  3. 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.
Volver al principio de este tema.

Abandonar una sesión de MPSD

Para permitir que un usuario abandone una sesión, el título debe hacer lo siguiente:
  1. Llame a XblMultiplayerSessionLeave para la sesión de juego.
  2. Actualice la sesión de juego en MPSD como se describe en la sección Actualizar una sesión de MPSD de este tema.
  3. Si es necesario, llame al método XblMultiplayerSessionLeave para la sesión de sala de espera y, a continuación, actualice esa sesión.
  4. Si es necesario para la sesión de sala de espera, cierre la API multijugador anulando el registro mediante llamadas a XblMultiplayerRemoveSubscriptionLostHandler y XblMultiplayerRemoveSessionChangedHandler.
El diagrama de flujo siguiente muestra cómo abandonar la sesión y cerrar el modo multijugador. Volver al principio de este tema.

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:
  1. Acceda al estado de sesión más reciente de la sesión de vale que se creó durante el emparejamiento.
  2. Agregue jugadores disponibles para el juego desde la sesión de sala de espera.
  3. Determine si la sesión de vale está llena.
  4. Si la sesión está llena, continúe con el juego.
  5. 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 preserveSession establecido en Always.
  6. Continúe con el emparejamiento. Para obtener más información, consulte Información general del emparejamiento.
El diagrama de flujo siguiente muestra cómo rellenar los espacios abiertos de la sesión durante el emparejamiento. Volver al principio de este tema.

Crear un vale de partida

Para crear un vale de partida, el explorador (scout) de emparejamiento debe hacer lo siguiente:
  1. 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}).
  2. Establezca el parámetro preserveSession en Never si 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ámetro preserveSession en Always para 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.
  3. Use XblCreateMatchTicketResponse::EstimatedWaitTime, que se devuelve en el objeto CreateMatchTicketResponse, para establecer las expectativas del usuario sobre el tiempo de emparejamiento.
  4. 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.
Volver al principio de este tema.

Obtener el estado del vale de partida

Su título debe hacer lo siguiente para recuperar el estado del vale de partida.
  1. Obtenga el objeto XblMultiplayerSessionHandle de la sesión de vale.
  2. Llame a XblMultiplayerSessionMatchmakingServer para acceder al objeto XblMultiplayerMatchmakingServer que se usó en el emparejamiento.
  3. Compruebe el objeto XblMultiplayerMatchmakingServer para 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.
Última modificación el 28 de agosto de 2026