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

# Lobby SDK 快速入门

> 本快速入门介绍先决条件、集成以及初始 API 调用,帮助你设置 PlayFab Multiplayer C/C++ SDK 并创建你的第一个 PlayFab 大厅。

本文介绍如何为 PlayFab Lobby 设置开发环境,并使用 PlayFab Multiplayer C/C++ SDK 创建你的第一个大厅。

<Note>
  PlayFab Multiplayer SDK 还为 PlayFab Matchmaking 提供 API。 \* 有关 C++ API 的更多信息,请参阅 [Matchmaking SDK 快速入门](/services/playfab/multiplayer/matchmaking/quickstart-client-sdk)。\* 有关 Unity API 的更多信息,请参阅 [Unity 快速入门](/services/playfab/multiplayer/lobby/lobby-matchmaking-sdks/multiplayer-unity-sdk-getting-started) \* 有关 Unreal API 的更多信息,请参阅 [Unreal 快速入门](/services/playfab/multiplayer/networking/party-unreal-engine-oss-quickstart)
</Note>

## 先决条件

若要使用 PlayFab 大厅,你需要一个 [PlayFab 帐户](https://developer.playfab.com)。有关创建帐户的说明,请参阅[快速入门:Game Manager](/services/playfab/live-service-management/gamemanager/quickstart)。

## 下载并设置 PlayFab Multiplayer SDK

下载适用于你平台的 [C/C++ SDK](/services/playfab/multiplayer/lobby/lobby-matchmaking-sdks/lobby-matchmaking-sdks),并将提供的头文件和库文件集成到你的构建中。

<Note>
  本快速入门重点介绍使用 C/C++ SDK。有关 Unity 和 Unreal 接口,请参阅以下文章: \* [Unity 快速入门](/services/playfab/multiplayer/lobby/lobby-matchmaking-sdks/multiplayer-unity-sdk-getting-started) \* [Unreal 快速入门](/services/playfab/multiplayer/networking/party-unreal-engine-oss-quickstart)
</Note>

## 登录一个 PlayFab 实体

若要使用 PlayFab Lobby SDK,你需要使用 PlayFab 实体键和实体令牌对客户端进行身份验证。通过使用 [LoginWithCustomId](https://learn.microsoft.com/en-us/rest/api/playfab/client/authentication/login-with-custom-id) REST API 登录来获取 PlayFab 实体键和令牌对。此 API 也可通过 [PlayFab Services SDK](/services/playfab/sdks/playfab-sdk-intro) 以 C/C++ 投影的形式使用。

<Note>
  LoginWithCustomId 是快速开始使用 PlayFab 功能的一种简便方法,但并非用于生产发布的登录机制。有关登录指导,请参阅[登录基础与最佳实践](/services/playfab/identity/player-identity/login/login-basics-best-practices)。
</Note>

## 初始化 PlayFab Multiplayer SDK

按照以下基本步骤初始化 PlayFab Multiplayer SDK:

1. 通过调用 [PFMultiplayerInitialize](/services/playfab/multiplayer/lobby/playfabmultiplayerreference-cpp/pfmultiplayer/functions/pfmultiplayerinitialize) 初始化 SDK
2. 调用 [PFMultiplayerSetEntityToken](/services/playfab/multiplayer/lobby/playfabmultiplayerreference-cpp/pfmultiplayer/functions/pfmultiplayersetentitytoken),设置库代表你的玩家所使用的实体键和令牌。

```cpp theme={null}
static PFMultiplayerHandle g_pfmHandle = nullptr;
...
...
HRESULT hr = S_OK;

// Initialize the PFMultiplayer library.
hr = PFMultiplayerInitialize(titleId, &g_pfmHandle);
if (FAILED(hr))
{
    // handle initialize failure
    printf("PFMultiplayerInitialize failed! %s\n", PFMultiplayerGetErrorMessage(hr));
    return hr;
}

// Set an entity token for a local user. The token is used to authenticate PlayFab operations on behalf of this user. 
// Tokens can expire, and this API token should be called again when this token is refreshed.
hr = PFMultiplayerSetEntityToken(g_pfmHandle, localUserEntity, entityToken);
if (FAILED(hr))
{
    // handle set entity token failure
    printf("PFMultiplayerSetEntityToken failed! %s\n", PFMultiplayerGetErrorMessage(hr));
    return hr;
}
```

## 创建大厅

最后,我们将按以下基本步骤创建一个大厅:

1. 调用 [PFMultiplayerCreateAndJoinLobby](/services/playfab/multiplayer/lobby/playfabmultiplayerreference-cpp/pflobby/functions/pfmultiplayercreateandjoinlobby)
2. 通过定期轮询 [PFMultiplayerStartProcessingLobbyStateChanges](/services/playfab/multiplayer/lobby/playfabmultiplayerreference-cpp/pflobby/functions/pfmultiplayerstartprocessinglobbystatechanges) 以检查异步完成,查看是否有 [PFLobbyCreateAndJoinLobbyCompletedStateChange](/services/playfab/multiplayer/lobby/playfabmultiplayerreference-cpp/pflobby/functions/pfmultiplayerstartprocessinglobbystatechanges)。

```cpp theme={null}
PFLobbyCreateConfiguration lobbyConfiguration{};
lobbyConfiguration.maxMemberCount = 16;
lobbyConfiguration.ownerMigrationPolicy = PFLobbyOwnerMigrationPolicy::Automatic;
lobbyConfiguration.accessPolicy = PFLobbyAccessPolicy::Public;

PFLobbyJoinConfiguration memberConfiguration{};

PFLobbyHandle lobby;
HRESULT hr = PFMultiplayerCreateAndJoinLobby(g_pfmHandle, localUserEntity, &lobbyConfiguration, &memberConfiguration, nullptr, &lobby);
if (FAILED(hr))
{
    // handle immediate create failure
    printf("PFMultiplayerCreateAndJoinLobby failed! %s\n", PFMultiplayerGetErrorMessage(hr));
    return hr;
}

// NOTE: to simplify this quickstart, we'll synchronously block waiting for the CreateAndJoinLobby operation
// to finish. In a real implementation, this polling would be done asynchronously on a background thread/worker.
bool createAndJoinLobbyFinished = false;
while (!createAndJoinLobbyFinished)
{
    uint32_t lobbyStateChangeCount;
    const PFLobbyStateChange * const * lobbyStateChanges;
    HRESULT hr = PFMultiplayerStartProcessingLobbyStateChanges(m_pfmHandle, &lobbyStateChangeCount, &lobbyStateChanges);
    if (FAILED(hr))
    {
        // handle the failure
        printf("PFMultiplayerStartProcessingLobbyStateChanges failed! %s\n", PFMultiplayerGetErrorMessage(hr));
        return hr;
    }

    for (uint32_t i = 0; i < lobbyStateChangeCount; ++i)
    {
        const PFLobbyStateChange* stateChange = lobbyStateChanges[i];
        switch (stateChange->stateChangeType)
        {
            case PFLobbyStateChangeType::CreateAndJoinLobbyCompleted:
            {
                auto createAndJoinStateChange = 
                    static_cast<const PFLobbyCreateAndJoinLobbyCompletedStateChange*>(stateChange);

                if (SUCCEEDED(createAndJoinStateChange->result))
                {
                    // lobby successfully created!
                    printf("Lobby 0x%p successfully created!\n", createAndJoinStateChange->lobby);
                }
                else
                {
                    // report asynchronous failure
                    printf("Failed to create lobby 0x%p! %s\n",
                        createAndJoinStateChange->lobby,
                        PFMultiplayerGetErrorMessage(createAndJoinStateChange->result));
                }
                createAndJoinLobbyFinished = true;
                break;
            }
        }
    }

    hr = PFMultiplayerFinishProcessingLobbyStateChanges(m_pfmHandle, lobbyStateChangeCount, lobbyStateChanges);
    if (FAILED(hr))
    {
        printf("PFMultiplayerFinishProcessingLobbyStateChanges failed! %s\n", PFMultiplayerGetErrorMessage(hr));
        return hr;
    }
}
```

有关创建大厅的更多信息,请参阅[创建大厅](/services/playfab/multiplayer/lobby/create-a-lobby)。

有关处理异步操作的更多信息,请参阅[异步操作与通知](/services/playfab/multiplayer/lobby/lobby-and-matchmaking-client-sdk-async)。

## 后续步骤

* [查找并加入大厅](/services/playfab/multiplayer/lobby/join-lobbies)
* [邀请其他玩家加入大厅](/services/playfab/multiplayer/lobby/lobby-invites)
* [使用大厅属性协调游戏会话](/services/playfab/multiplayer/lobby/lobby-properties)

## 另请参阅

* [创建大厅](/services/playfab/multiplayer/lobby/create-a-lobby)
* [异步操作与通知](/services/playfab/multiplayer/lobby/lobby-and-matchmaking-client-sdk-async)
* [创建可搜索的大厅](/services/playfab/multiplayer/lobby/define-search-keywords)
* [大厅属性](/services/playfab/multiplayer/lobby/lobby-properties)
* [Lobby SDK 参考](/services/playfab/multiplayer/lobby/playfabmultiplayerreference-cpp/pflobby/pflobby_members)
* [Lobby SDK](/services/playfab/multiplayer/lobby/lobby-matchmaking-sdks/lobby-matchmaking-sdks)
* [Matchmaking SDK 快速入门](/services/playfab/multiplayer/matchmaking/quickstart-client-sdk)


## Related topics

- [Matchmaking SDK 快速入门](/zh-CN/services/playfab/multiplayer/matchmaking/quickstart-client-sdk.md)
- [PlayFab Lobby 和 Matchmaking SDK](/zh-CN/services/playfab/multiplayer/lobby/lobby-matchmaking-sdks/lobby-matchmaking-sdks.md)
- [快速入门](/zh-CN/services/playfab/economy-monetization/economy-v2/quickstart.md)
- [Android 快速入门](/zh-CN/services/playfab/sdks/c/quickstart-android.md)
- [iOS 快速入门](/zh-CN/services/playfab/sdks/c/quickstart-ios.md)
