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

# Jugar multijugador con amigos mediante Multiplayer Manager

> Guía paso a paso para usar Multiplayer Manager para inicializar una sesión de sala, enviar invitaciones de XBOX Live y permitir que los amigos se unan a un juego en curso.

<a id="top" />

En un escenario multijugador sencillo, un jugador de tu juego puede jugar en línea con amigos. Este tema describe los pasos básicos que debes implementar para admitir este escenario mediante Multiplayer Manager.

## Pasos para enviar y aceptar una invitación

Los siguientes pasos usan Multiplayer Manager para enviar una invitación al amigo de un usuario de modo que ese amigo pueda unirse a un 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](#send-invites)
4. [Aceptar invitaciones](#accept-invites)
5. [Unirse a una sesión de juego desde la sala](#join-game)

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 con amigos (diagrama de flujo)](/services/xbox-services/multiplayer/mpm/concepts/flowcharts/live-mpm-play-with-friends).

## 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 mediante `lobby()` 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.

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

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

En los juegos basados en el Microsoft Game Development Kit (GDK), después de que se inicie el juego, escucha los eventos de invitación llamando a [XGameActivationRegisterForEvent](/reference/system/xgameactivation/functions/xgameactivationregisterforevent).

En los juegos basados en el Software Development Kit de XBOX One y en la Plataforma universal de Windows (UWP), 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) generará un error y proporcionará 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 une 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}

void CALLBACK MyXGameInviteEventCallback(
    _In_opt_ void* context,
    _In_ const XGameActivationInfo* activationInfo)
{
    UNREFERENCED_PARAMETER(context);
    if (activationInfo->type == XGameActivationType::AcceptedGameInvite)
    {
        if (activationInfo->inviteUri != nullptr)
        {
            std::string inviteString(activationInfo->inviteUri);
            auto pos = inviteString.find("handle=");
            auto inviteHandleId = inviteString.substr(pos + 7, 36);

            // Now use inviteHandleId when calling XblMultiplayerManagerJoinLobby().  
            // See the example call as follows.
        }
    }
}

XTaskQueueRegistrationToken token = { 0 };
HRESULT hr = XGameActivationRegisterForEvent(
    queue,
    nullptr,
    MyXGameInviteEventCallback,
    &token);

```

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

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

## Unirse a una sesión de juego desde la sala <a id="join-game" />

Después de que se hayan aceptado las invitaciones y el host esté listo para empezar a jugar, puedes iniciar un nuevo juego que incluya a los miembros de la sesión de sala llamando a [XblMultiplayerManagerJoinGameFromLobby](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerjoingamefromlobby).

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

#### API de C plana

```cpp theme={null}
HRESULT hr = XblMultiplayerManagerJoinGameFromLobby(gameSessionTemplateName);
if (!SUCCEEDED(hr))
{
    // Handle error.
}
```

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

Multiplayer Manager realiza las siguientes funciones para unirse a una sesión de juego desde la sala.

* Crear la sesión de juego.
* 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.
* Anunciar el juego mediante la sesión de sala.

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


## Related topics

- [Jugar a un juego con amigos (diagrama de flujo)](/es/services/xbox-services/multiplayer/mpm/concepts/flowcharts/live-mpm-play-with-friends.md)
- [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 multijugador con SmartMatch y MPM](/es/services/xbox-services/multiplayer/mpm/how-to/live-play-multiplayer-with-matchmaking.md)
- [Escenarios multijugador comunes](/es/services/xbox-services/multiplayer/overviews/live-common-multiplayer-scenarios.md)
- [Enviar invitaciones de juego mediante Multiplayer Manager](/es/services/xbox-services/multiplayer/mpm/how-to/live-send-game-invites.md)
