> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Tareas multijugador

> Ejemplos de código para tareas comunes de Multijugador 2015: suscribirse a los cambios de MPSD, crear sesiones, enviar invitaciones, unirse, vales de emparejamiento y actividad.

<a id="top" />

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)](#sfmscn)
* [Crear una sesión de MPSD](#cams)
* [Establecer un árbitro para una sesión de MPSD](#set-an-arbiter-for-an-mpsd-session)
* [Administrar la activación del título](#mta)
* [Hacer que el usuario admita uniones](#mtuj)
* [Enviar invitaciones de juego](#sgi)
* [Unirse a una sesión de juego desde una sesión de sala de espera](#jagsfals)
* [Unirse a una sesión de MPSD desde una activación del título](#jamsfata)
* [Establecer la actividad actual del usuario](#stuca)
* [Actualizar una sesión de MPSD](#update-an-mpsd-session)
* [Abandonar una sesión de MPSD](#lams)
* [Rellenar los espacios abiertos de la sesión durante el emparejamiento](#fossdm)
* [Crear un vale de partida](#camt)
* [Obtener el estado del vale de partida](#gmts)

<a id="sfmscn" />

## Suscribirse a las notificaciones de cambios de sesión de Multiplayer Session Directory (MPSD)

<Note>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](/services/xbox-services/multiplayer/mpsd/concepts/live-session-templates) e [Información general de Multiplayer Session Directory](/services/xbox-services/multiplayer/mpsd/live-mpsd-overview).</Note>

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](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayeraddsessionchangedhandler) y [XblMultiplayerSessionSubscriptionLostHandler](/reference/live/xsapi-c/multiplayer_c/functions/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](/reference/live/xsapi-c/multiplayer_c/structs/xblmultiplayersessionchangeeventargs)`::Branch` y la propiedad [XblMultiplayerSessionChangeEventArgs](/reference/live/xsapi-c/multiplayer_c/structs/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](/reference/live/xsapi-c/multiplayer_c/functions/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](#update-an-mpsd-session) 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.

<img src="https://mintcdn.com/microsoft-4404708b/gzrdvT5kpqAXKEQt/images/gdk/services/Multiplayer_2015_Start_Multiplayer.png?fit=max&auto=format&n=gzrdvT5kpqAXKEQt&q=85&s=69f53200e2e51e3d975a3e5e7c9967fe" alt="Imagen de un diagrama de flujo que muestra cómo iniciar el modo multijugador suscribiéndose a los eventos que se describen en el procedimiento anterior." width="493" height="456" data-path="images/gdk/services/Multiplayer_2015_Start_Multiplayer.png" />

### 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.

<Note>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.</Note>

[Volver al principio de este tema.](#top)

<a id="cams" />

## Crear una sesión de MPSD

<Note>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.</Note>

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](/reference/live/xsapi-c/multiplayer_c/functions/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](/reference/live/xsapi-c/multiplayer_c/functions/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](#update-an-mpsd-session) 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**

```cpp theme={null}
auto asyncBlock = std::make_unique<XAsyncBlock>();
asyncBlock->queue = queue;
asyncBlock->context = nullptr;
asyncBlock->callback = [](XAsyncBlock* asyncBlock)
{
    std::unique_ptr<XAsyncBlock> asyncBlockPtr{ asyncBlock }; // Take over ownership of the XAsyncBlock*.

    XblMultiplayerSessionHandle sessionHandle;
    HRESULT hr = XblMultiplayerWriteSessionResult(asyncBlock, &sessionHandle);
    if (SUCCEEDED(hr))
    {
        // Process multiplayer session handle.
    }
    else
    {
        // Handle failure.
    }
};

XblMultiplayerSessionReference ref;
pal::strcpy(ref.Scid, sizeof(ref.Scid), SCID);
pal::strcpy(ref.SessionTemplateName, sizeof(ref.SessionTemplateName), SESSION_TEMPLATE_NAME);
pal::strcpy(ref.SessionName, sizeof(ref.SessionName), SESSION_NAME);

XblMultiplayerSessionInitArgs args = {};

XblMultiplayerSessionHandle sessionHandle = XblMultiplayerSessionCreateHandle(XUID, &ref, &args);

auto hr = XblMultiplayerSessionJoin(
    sessionHandle,
    memberCustomConstantsJson.c_str(),
    initializeRequested,
    joinWithActiveStatus);
    
 hr = XblMultiplayerWriteSessionAsync(xblContextHandle, sessionHandle, XblMultiplayerSessionWriteMode::CreateNew, asyncBlock.get());
if (SUCCEEDED(hr))
{
    // The call succeeded, so release the std::unique_ptr ownership of XAsyncBlock* because the callback will take over ownership.
    // If the call fails, std::unique_ptr will keep ownership and delete XAsyncBlock*.
    asyncBlock.release();
}
```

Para obtener más información, consulte lo siguiente:

* [XAsyncBlock](/reference/system/xasync/structs/xasyncblock)

* [XblMultiplayerSessionCreateHandle](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessioncreatehandle)

* [XblMultiplayerSessionInitArgs](/reference/live/xsapi-c/multiplayer_c/structs/xblmultiplayersessioninitargs)

* [XblMultiplayerSessionReference](/reference/live/xsapi-c/multiplayer_c/structs/xblmultiplayersessionreference)

* [XblMultiplayerSessionWriteMode](/reference/live/xsapi-c/multiplayer_c/enums/xblmultiplayersessionwritemode)

* [XblMultiplayerWriteSessionAsync](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayerwritesessionasync)

* [XblMultiplayerWriteSessionResult](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayerwritesessionresult)

[Volver al principio de este tema.](#top)

<a id="set-an-arbiter-for-an-mpsd-session" />

## 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.

<Note>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.</Note>

1. Recupere de MPSD los tokens de dispositivo de los candidatos a host llamando a [XblMultiplayerSessionMembers](/reference/live/xsapi-c/multiplayer_c/functions/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](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessionhostcandidates).

2. Seleccione el host requerido en la lista de candidatos a host.

3. Llame a [XblMultiplayerSessionSetHostDeviceToken](/reference/live/xsapi-c/multiplayer_c/functions/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](/services/xbox-services/multiplayer/mpsd/how-to/live-mpsd-status-codes).

5. Actualice la sesión en MPSD como se describe en la sección [Actualizar una sesión de MPSD](#update-an-mpsd-session) 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](/services/xbox-services/multiplayer/mpsd/concepts/live-mpsd-details#session-arbiter) en el tema Temas avanzados de sesión multijugador.

[Volver al principio de este tema.](#top)

<a id="mta" />

## 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.

<Note>Su título debe esperar nuevos argumentos de activación en cualquier momento y nunca debe codificarse en función de la longitud.</Note>

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](#sfmscn) 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](#jamsfata) 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](#stuca) 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.

<img src="https://mintcdn.com/microsoft-4404708b/gzrdvT5kpqAXKEQt/images/gdk/services/Multiplayer_2015_OnActivation.png?fit=max&auto=format&n=gzrdvT5kpqAXKEQt&q=85&s=12c7da4ee04fdc9fe5c78471826cb9ed" alt="Imagen de un diagrama de flujo que muestra cómo controlar la activación del título." width="982" height="1272" data-path="images/gdk/services/Multiplayer_2015_OnActivation.png" />

[Volver al principio de este tema.](#top)

<a id="mtuj" />

## 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](#jamsfata) 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](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessionsethostdevicetoken).

6. Intente escribir la sesión mediante una llamada a [XblMultiplayerWriteSessionAsync](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayerwritesessionasync).

7. Establezca la sesión como la sesión activa. Para obtener más información, consulte [Establecer la actividad actual del usuario](#stuca) en este tema.

El diagrama de flujo siguiente muestra los pasos para permitir que otros jugadores se unan a un usuario durante un juego.

<img src="https://mintcdn.com/microsoft-4404708b/gzrdvT5kpqAXKEQt/images/gdk/services/Multiplayer_2015_Become_Joinable.png?fit=max&auto=format&n=gzrdvT5kpqAXKEQt&q=85&s=2b2f2be1ab3913793e41659a356e5aa1" alt="Imagen de un diagrama de flujo que muestra los pasos para permitir que otros jugadores se unan a un usuario durante un juego." width="607" height="869" data-path="images/gdk/services/Multiplayer_2015_Become_Joinable.png" />

[Volver al principio de este tema.](#top)

<a id="sgi" />

## 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](#mtuj) 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](/reference/live/xsapi-c/multiplayer_c/functions/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](/reference/system/xgameui/functions/xgameuishowplayerpickerasync).

4. Si se usa la interfaz de usuario de invitaciones, llame a [XGameUiShowSendGameInviteAsync](/reference/system/xgameui/functions/xgameuishowsendgameinviteasync) para mostrar la interfaz de usuario de invitaciones.

5. Controle el [XblMultiplayerAddSessionChangedHandler](/reference/live/xsapi-c/multiplayer_c/functions/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](#mta) en este tema.

El diagrama de flujo siguiente muestra cómo enviar invitaciones.

<img src="https://mintcdn.com/microsoft-4404708b/gzrdvT5kpqAXKEQt/images/gdk/services/Multiplayer_2015_Send_Invites.png?fit=max&auto=format&n=gzrdvT5kpqAXKEQt&q=85&s=98dd44729bea6ad14c2cc7f54f7c30a2" alt="Imagen de un diagrama de flujo que muestra cómo enviar invitaciones." width="922" height="736" data-path="images/gdk/services/Multiplayer_2015_Send_Invites.png" />

[Volver al principio de este tema.](#top)

<a id="jagsfals" />

## 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](/reference/live/xsapi-c/multiplayer_c/functions/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](/reference/live/xsapi-c/multiplayer_c/functions/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.](#top)

<a id="jamsfata" />

## 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](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersetsubscriptionsenabled).

5. Cree un objeto `XblMultiplayerSessionHandle` local llamando a [XblMultiplayerSessionCreateHandle](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessioncreatehandle).

6. Llame a [XblMultiplayerSessionJoin](/reference/live/xsapi-c/multiplayer_c/functions/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](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessionsetsessionchangesubscription) para recibir un aviso cuando la sesión cambie después de la unión.

8. Llame a [XblMultiplayerWriteSessionByHandleAsync](/reference/live/xsapi-c/multiplayer_c/functions/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.](#top)

<a id="stuca" />

## 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.

<Note>La actividad establecida a través de una sesión se puede eliminar llamando a [XblMultiplayerClearActivityAsync](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayerclearactivityasync).</Note>

Para establecer una sesión como la actividad actual del usuario, el título llama a [XblMultiplayerSetActivityAsync](/reference/live/xsapi-c/multiplayer_c/functions/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](#jamsfata) en este tema.

[Volver al principio de este tema.](#top)

<a id="update-an-mpsd-session" />

## Actualizar una sesión de MPSD

<Note>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.</Note>

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](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessionleave).

2. Cuando haya realizado todos los cambios, escriba los cambios locales en MPSD mediante cualquiera de estos métodos.

   * [XblMultiplayerWriteSessionAsync](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayerwritesessionasync)
   * [XblMultiplayerWriteSessionByHandleAsync](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayerwritesessionbyhandleasync)

   Establezca el modo de escritura en [XblMultiplayerSessionWriteMode](/reference/live/xsapi-c/multiplayer_c/enums/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](/services/xbox-services/multiplayer/mpsd/live-mpsd-overview#synchronization-of-session-updates) 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.](#top)

<a id="lams" />

## 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](/reference/live/xsapi-c/multiplayer_c/functions/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](#update-an-mpsd-session) 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](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayerremovesubscriptionlosthandler) y [XblMultiplayerRemoveSessionChangedHandler](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayerremovesessionchangedhandler).

El diagrama de flujo siguiente muestra cómo abandonar la sesión y cerrar el modo multijugador.

<img src="https://mintcdn.com/microsoft-4404708b/gzrdvT5kpqAXKEQt/images/gdk/services/Multiplayer_2015_Shut_Down.png?fit=max&auto=format&n=gzrdvT5kpqAXKEQt&q=85&s=1b43ed2e21a28db2347eb8fd9f831aef" alt="Imagen de un diagrama de flujo que muestra cómo abandonar la sesión y cerrar el modo multijugador." width="694" height="787" data-path="images/gdk/services/Multiplayer_2015_Shut_Down.png" />

[Volver al principio de este tema.](#top)

<a id="fossdm" />

## 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](#camt) 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](/services/xbox-services/multiplayer/matchmaking/live-matchmaking-overview).

El diagrama de flujo siguiente muestra cómo rellenar los espacios abiertos de la sesión durante el emparejamiento.

<img src="https://mintcdn.com/microsoft-4404708b/gzrdvT5kpqAXKEQt/images/gdk/services/Multiplayer_2015_Fill_Open_Slots.png?fit=max&auto=format&n=gzrdvT5kpqAXKEQt&q=85&s=536853a998a165affa7552a02f87d778" alt="Imagen de un diagrama de flujo que muestra cómo rellenar los espacios abiertos de la sesión durante el emparejamiento." width="794" height="716" data-path="images/gdk/services/Multiplayer_2015_Fill_Open_Slots.png" />

[Volver al principio de este tema.](#top)

<a id="camt" />

## Crear un vale de partida

Para crear un vale de partida, el explorador (scout) de emparejamiento debe hacer lo siguiente:

1. Llame a [XblMatchmakingCreateMatchTicketAsync](/reference/live/xsapi-c/matchmaking_c/functions/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](/reference/live/xsapi-c/matchmaking_c/structs/xblcreatematchticketresponse)`::EstimatedWaitTime`, que se devuelve en el objeto `CreateMatchTicketResponse`, para establecer las expectativas del usuario sobre el tiempo de emparejamiento.

4. Use [XblCreateMatchTicketResponse](/reference/live/xsapi-c/matchmaking_c/structs/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](/reference/live/xsapi-c/matchmaking_c/functions/xblmatchmakingdeletematchticketasync).

[Volver al principio de este tema.](#top)

<a id="gmts" />

## 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](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessionmatchmakingserver) para acceder al objeto [XblMultiplayerMatchmakingServer](/reference/live/xsapi-c/multiplayer_c/structs/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.


## Related topics

- [Temas avanzados de las sesiones multijugador](/es/services/xbox-services/multiplayer/mpsd/concepts/live-mpsd-details.md)
- [Información general de Multiplayer Session Directory](/es/services/xbox-services/multiplayer/mpsd/live-mpsd-overview.md)
- [Código de ejemplo de Multiplayer Session Directory (MPSD)](/es/services/xbox-services/multiplayer/mpsd/how-to/live-mpsd-howto-nav.md)
- [Preguntas frecuentes y solución de problemas de multijugador](/es/services/xbox-services/multiplayer/mpsd/concepts/live-multiplayer-2015-faq.md)
- [Procedimientos](/es/services/xbox-services/multiplayer/mpsd/how-to/index.md)
