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

# Emparejamiento multijugador con SmartMatch y MPM

> Usa Multiplayer Manager y el emparejamiento de SmartMatch para encontrar jugadores de XBOX Live, crear una sesión de sala, enviar invitaciones opcionales e iniciar una partida multijugador.

<a id="top" />

Este tema describe los pasos básicos que debes seguir para implementar el emparejamiento de SmartMatch mediante Multiplayer Manager.

Es posible que un jugador no tenga suficientes amigos en línea cuando quiera jugar a un juego, o que simplemente quiera jugar contra jugadores aleatorios en línea.
Puedes usar el servicio SmartMatch para encontrar otros jugadores de XBOX.

## Buscar una partida

Los siguientes pasos usan Multiplayer Manager para enviar una invitación al amigo de un jugador de modo que ese amigo pueda unirse al juego en curso.

1. [Inicializar Multiplayer Manager](#initialize-multiplayer-manager)
2. [Crear la sesión de sala agregando usuarios locales](#create-lobby)
3. [Enviar invitaciones a amigos (opcional)](#send-invites)
4. [Aceptar invitaciones (opcional)](#accept-invites)
5. [Buscar una partida](#find-match)

Los pasos 1, 2, 3 y 5 se realizan en el dispositivo que realiza la invitación.
El paso 4 normalmente se inicia en el dispositivo del invitado, tras el inicio de la aplicación mediante la activación de protocolo.

Para obtener más información, consulta [Jugar a un juego mediante el emparejamiento de SmartMatch (diagrama de flujo)](/services/xbox-services/multiplayer/mpm/concepts/flowcharts/live-mpm-play-with-smartmatch-matchmaking).

## Inicializar Multiplayer Manager <a id="initialize-multiplayer-manager" />

El objeto de sesión de sala se crea automáticamente cuando Multiplayer Manager se inicializa con un nombre de plantilla de sesión válido. Las plantillas de sesión se definen en la configuración del servicio.

<Note>La instancia de la sesión de sala en el servicio no se crea hasta que se agrega un usuario.</Note>

### API de C plana

```cpp theme={null}
HRESULT hr = XblMultiplayerManagerInitialize(lobbySessionTemplateName, queueUsedByMultiplayerManager);
```

Para obtener más información, consulta [XblMultiplayerManagerInitialize](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerinitialize).

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

## Crear la sesión de sala agregando usuarios locales<a id="create-lobby" />

Agrega a la sesión de sala los usuarios de los servicios XBOX que han iniciado sesión localmente.
Se hospeda una nueva sala cuando se agrega el primer usuario.
Todos los demás usuarios se agregan a la sala existente como usuarios secundarios.

Multiplayer Manager anuncia la sala en el shell para que los amigos se unan.
Solo puedes enviar invitaciones, establecer propiedades de la sala y acceder a los miembros de la sala después de haber agregado al usuario local.

Cuando un usuario local se une a la sala, se recomienda establecer su dirección de conexión y las propiedades personalizadas.

Debes repetir este proceso para todos los usuarios que han iniciado sesión localmente.

### Agregar un único usuario local

#### API de C plana

```cpp theme={null}
HRESULT hr = XblMultiplayerManagerLobbySessionAddLocalUser(xblUserHandle);

if (!SUCCEEDED(hr))
{
    // Handle failure.
}

// Set member connection address.
const char* connectionAddress = "1.1.1.1";
hr = XblMultiplayerManagerLobbySessionSetLocalMemberConnectionAddress(
    xblUserHandle, connectionAddress, context);

if (!SUCCEEDED(hr))
{
    // Handle failure.
}

// Set custom member properties.
const char* propName = "Name";
const char* propValueJson = "{}";
hr = XblMultiplayerManagerLobbySessionSetProperties(propName, propValueJson, context);

if (!SUCCEEDED(hr))
{
    // Handle failure.
}
...
```

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

* [XblMultiplayerManagerLobbySessionAddLocalUser](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerlobbysessionaddlocaluser)
* [XblMultiplayerManagerLobbySessionSetLocalMemberConnectionAddress](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerlobbysessionsetlocalmemberconnectionaddress)
* [XblMultiplayerManagerLobbySessionSetProperties](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerlobbysessionsetproperties)

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

### Agregar varios usuarios locales

#### API de C plana

```cpp theme={null}
std::vector<XblUserHandle> xblUsers;
for (XblUserHandle xblUserHandle : xblUsers)
{
    HRESULT hr = XblMultiplayerManagerLobbySessionAddLocalUser(xblUserHandle);

    if (!SUCCEEDED(hr))
    {
        // Handle failure.
    }

    // Set member connection address.
    const char* connectionAddress = "1.1.1.1";
    hr = XblMultiplayerManagerLobbySessionSetLocalMemberConnectionAddress(
        xblUserHandle, connectionAddress, context);

    if (!SUCCEEDED(hr))
    {
        // Handle failure.
    }

    // Set custom member properties.
    const char* propName = "Name";
    const char* propValueJson = "{}";
    hr = XblMultiplayerManagerLobbySessionSetProperties(propName, propValueJson, context);
    ...
}
```

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

* [XblMultiplayerManagerLobbySessionAddLocalUser](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerlobbysessionaddlocaluser)
* [XblMultiplayerManagerLobbySessionSetLocalMemberConnectionAddress](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerlobbysessionsetlocalmemberconnectionaddress)
* [XblMultiplayerManagerLobbySessionSetProperties](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerlobbysessionsetproperties)

Los cambios se procesan por lotes en la siguiente llamada a [XblMultiplayerManagerDoWork](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerdowork).
Multiplayer Manager genera un evento [XblMultiplayerEventType](/reference/live/xsapi-c/multiplayer_manager_c/enums/xblmultiplayereventtype)`::UserAdded` cada vez que se agrega un usuario local a la sesión de sala.

Se recomienda comprobar el código de error del evento para ver si ese usuario se agregó correctamente.
En caso de error, un mensaje de error proporciona detalles sobre los motivos del error.

Multiplayer Manager realiza las siguientes funciones para crear la sesión de sala agregando usuarios locales.

* Registrar las suscripciones de actividad en tiempo real y multijugador en el servicio multijugador de los servicios XBOX.
* Crear la sesión de sala.
* Unir a todos los jugadores locales como activos.
* Cargar la dirección segura de dispositivo (SDA).
* Establecer las propiedades de los miembros.
* Registrarse para los eventos de cambio de sesión.
* Establecer la sesión de sala como sesión activa.

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

## Enviar invitaciones a amigos (opcional) <a id="send-invites" />

Muestra la interfaz de usuario estándar de XBOX en la que el jugador puede seleccionar amigos o jugadores recientes para invitarlos al juego.
Cuando el jugador confirma su selección, Multiplayer Manager envía las invitaciones a los jugadores seleccionados.

Los juegos también pueden usar el método [XblMultiplayerManagerLobbySessionInviteUsers](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerlobbysessioninviteusers) para enviar invitaciones a un conjunto de jugadores definidos por sus identificadores de usuario de los servicios XBOX.
Este método es útil si usas tu propia interfaz de usuario del juego en lugar de la interfaz de usuario estándar de XBOX.

#### API de C plana

```cpp theme={null}
size_t xuidsCount = 1;
uint64_t xuids[1] = {};
xuids[0] = 1234567891234567;
HRESULT hr = XblMultiplayerManagerLobbySessionInviteUsers(
    xblUserHandle, 
    xuids, 
    xuidsCount, 
    nullptr,    // ContextStringId 
    nullptr     // CustomActivationContext
);
```

Para obtener más información, consulta [XblMultiplayerManagerLobbySessionInviteUsers](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerlobbysessioninviteusers).

Multiplayer Manager realiza las siguientes funciones para enviar invitaciones a amigos.

* Muestra la interfaz de usuario invocable por el título (TCUI) estándar de XBOX
* Envía una invitación directamente a los jugadores seleccionados

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

## Aceptar invitaciones (opcional) <a id="accept-invites" />

Cuando un jugador invitado acepta una invitación de juego o se une al juego de un amigo mediante una interfaz de usuario del shell, el juego se inicia en su dispositivo mediante la activación de protocolo.
Después de que se inicie el juego, Multiplayer Manager puede usar los argumentos del evento de activación de protocolo para unirse a la sala.

Si el usuario invitado no se agrega mediante [XblMultiplayerManagerLobbySessionAddLocalUser](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerlobbysessionaddlocaluser), [XblMultiplayerManagerJoinLobby](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerjoinlobby) genera un error y proporciona el xuid para el que se envió la invitación al llamar a [XblMultiplayerEventArgsXuid](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayereventargsxuid) con el evento `JoinLobbyCompleted`.

Después de unirte a la sala, se recomienda establecer la dirección de conexión del miembro local y las propiedades personalizadas del miembro.
También puedes establecer el host mediante [XblMultiplayerManagerLobbySessionSetSynchronizedHost](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerlobbysessionsetsynchronizedhost) si no existe ninguno.

Por último, Multiplayer Manager unirá automáticamente al usuario a la sesión de juego si ya hay un juego en curso y hay espacio para el invitado.
El título recibe la notificación mediante el evento `JoinGameCompleted`, que proporciona un código de error y un mensaje adecuados.

Los resultados de error o de éxito se controlan mediante el evento `JoinLobbyCompleted`.

#### API de C plana

```cpp theme={null}
HRESULT hr = XblMultiplayerManagerJoinLobby(inviteHandleId, xblUserHandle);
if (!SUCCEEDED(hr))
{
    // Handle failure.
}

// Set member connection address.
const char* connectionAddress = "1.1.1.1";
hr = XblMultiplayerManagerLobbySessionSetLocalMemberConnectionAddress(
    xblUserHandle, connectionAddress, context);
```

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

* [XblMultiplayerManagerJoinLobby](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerjoinlobby)
* [XblMultiplayerManagerLobbySessionSetLocalMemberConnectionAddress](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerlobbysessionsetlocalmemberconnectionaddress)

Multiplayer Manager realiza las siguientes funciones para aceptar invitaciones.

* Registrar las suscripciones de actividad en tiempo real y multijugador.
* Unirse a la sesión de sala.
* Limpieza del estado de sala existente.
* Unir a todos los jugadores locales como activos.
* Cargar la SDA.
* Establecer las propiedades de los miembros.
* Registrarse para los eventos de cambio de sesión.
* Establecer la sesión de sala como sesión activa.
* Unirse a la sesión de juego (si existe).
* Usar un identificador de transferencia.

### Buscar partida <a id="find-match" />

Después de que se hayan aceptado las invitaciones y el host esté listo para empezar a jugar, puedes usar SmartMatch para realizar una de las siguientes acciones:

* Encontrar un juego existente que tenga suficientes espacios de jugador libres para todos los miembros de la sesión de sala llamando a [XblMultiplayerManagerFindMatch](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerfindmatch).
* Crear una nueva sesión de juego que incluya a todos los miembros de la sesión de sala y rellenar los espacios libres con otros jugadores que busquen una partida del mismo tipo de juego, llamando a [XblMultiplayerManagerJoinGameFromLobby](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerjoingamefromlobby) seguido de [XblMultiplayerManagerAutoFillMembersDuringMatchmaking](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerautofillmembersduringmatchmaking).

Antes de poder llamar a [XblMultiplayerManagerFindMatch](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerfindmatch), primero debes configurar hoppers en la configuración del servicio.
Un hopper define las reglas que SmartMatch usa para emparejar a los jugadores.

#### API de C plana

```cpp theme={null}
uint32_t timeoutInSeconds = 30;
HRESULT hr = XblMultiplayerManagerFindMatch(hopperName, attributesJson, timeoutInSeconds);
if (!SUCCEEDED(hr))
{
    // Handle failure.
}
```

Para obtener más información, consulta [XblMultiplayerManagerFindMatch](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerfindmatch).

Multiplayer Manager realiza las siguientes funciones para buscar una partida.

* Crear un vale de partida.
* Controlar todas las fases de calidad de servicio (QoS).
* Controlar los cambios en la lista de participantes.
* Volver a enviar (si es necesario).
* Unirse a la sesión de juego de destino.
* Anunciar el juego mediante la sesión de sala.

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


## Related topics

- [Jugar a un juego mediante el emparejamiento de SmartMatch (diagrama de flujo)](/es/services/xbox-services/multiplayer/mpm/concepts/flowcharts/live-mpm-play-with-smartmatch-matchmaking.md)
- [Emparejamiento SmartMatch](/es/services/xbox-services/multiplayer/matchmaking/live-matchmaking-nav.md)
- [Uso del emparejamiento de SmartMatch](/es/services/xbox-services/multiplayer/matchmaking/concepts/live-matchmaking-how-tos.md)
- [Información general sobre los conceptos de multijugador](/es/services/xbox-services/multiplayer/concepts/live-multiplayer-concepts.md)
- [Configuración del emparejamiento en Partner Center](/es/services/xbox-services/multiplayer/matchmaking/config/live-matchmaking-config.md)
