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

# 多人遊戲工作

> 常見 2015 多人遊戲工作的程式碼範例：訂閱 MPSD 變更、建立工作階段、傳送邀請、加入、配對票證與活動。

<a id="top" />

本主題說明如何實作與使用 2015 多人遊戲相關的特定工作。

本主題涵蓋下列內容：

* [訂閱多人遊戲工作階段目錄 (MPSD) 工作階段變更通知](#sfmscn)
* [建立 MPSD 工作階段](#cams)
* [為 MPSD 工作階段設定仲裁者](#set-an-arbiter-for-an-mpsd-session)
* [管理遊戲啟用](#mta)
* [讓使用者可被加入](#mtuj)
* [傳送遊戲邀請](#sgi)
* [從大廳工作階段加入遊戲工作階段](#jagsfals)
* [從遊戲啟用加入 MPSD 工作階段](#jamsfata)
* [設定使用者目前的活動](#stuca)
* [更新 MPSD 工作階段](#update-an-mpsd-session)
* [離開 MPSD 工作階段](#lams)
* [在配對期間填補開放的工作階段位置](#fossdm)
* [建立對戰票證](#camt)
* [取得對戰票證狀態](#gmts)

<a id="sfmscn" />

## 訂閱多人遊戲工作階段目錄 (MPSD) 工作階段變更通知

<Note>訂閱工作階段的變更時，相關聯的玩家必須在工作階段中處於作用中狀態。此外，也必須在工作階段的 `/constants/system/capabilities` 物件中將 `connectionRequiredForActiveMembers` 欄位設為 `true`。此欄位通常是在工作階段範本中設定。如需詳細資訊，請參閱[多人遊戲工作階段範本](/zh-TW/services/xbox-services/multiplayer/mpsd/concepts/live-session-templates)與[多人遊戲工作階段目錄概觀](/zh-TW/services/xbox-services/multiplayer/mpsd/live-mpsd-overview)。</Note>

若要接收 MPSD 工作階段變更通知，遊戲可以使用下列程序。

1. 同一位使用者的所有呼叫都使用相同的 `XblContextHandle` 物件。訂閱與此物件的存留期繫結。如果有多位本機使用者，請為每位使用者使用個別的 `XblContextHandle` 物件。

2. 為 [XblMultiplayerAddSessionChangedHandler](/zh-TW/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayeraddsessionchangedhandler) 與 [XblMultiplayerSessionSubscriptionLostHandler](/zh-TW/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessionsubscriptionlosthandler) 實作事件處理常式。

3. 如果要為多位使用者訂閱變更，請在 `XblMultiplayerAddSessionChangedHandler` 事件處理常式中新增程式碼，以避免不必要的工作。請使用 [XblMultiplayerSessionChangeEventArgs](/zh-TW/reference/live/xsapi-c/multiplayer_c/structs/xblmultiplayersessionchangeeventargs)`::Branch` 屬性與 [XblMultiplayerSessionChangeEventArgs](/zh-TW/reference/live/xsapi-c/multiplayer_c/structs/xblmultiplayersessionchangeeventargs)`::ChangeNumber` 屬性。使用這些屬性可讓您追蹤最後看到的變更，並忽略較舊的變更。

4. 呼叫 [XblMultiplayerSetSubscriptionsEnabled](/zh-TW/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersetsubscriptionsenabled) 以允許訂閱。

5. 建立本機工作階段物件，然後以作用中身分加入該工作階段。

6. 為每位使用者呼叫 `XblMultiplayerAddSessionChangedHandler`，並傳遞要接收通知的工作階段變更類型。

7. 依照本主題中[更新 MPSD 工作階段](#update-an-mpsd-session)一節的說明，將工作階段寫入 MPSD。

下列流程圖顯示如何透過訂閱前述程序中所述的事件來啟動多人遊戲。

<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="流程圖影像，顯示如何透過訂閱前述程序中所述的事件來啟動多人遊戲。" width="493" height="456" data-path="images/gdk/services/Multiplayer_2015_Start_Multiplayer.png" />

### 剖析重複的工作階段變更通知

當有多位使用者訂閱同一個工作階段的通知時，該工作階段的每項變更都會為每位使用者觸發一次肩拍通知。
這些肩拍通知中，除了一個之外其餘都是重複的。

雖然我們仍建議遊戲為工作階段中的每位使用者訂閱通知，但遊戲應該忽略已收到通知的任何變更。您可以使用 `Branch` 與 `ChangeNumber` 屬性來達成此目的。

若要偵測多次肩拍通知，遊戲應該執行下列動作：

* 為每個評估過的 `Branch` 屬性值，儲存最新的 `ChangeNumber` 屬性值。

* 如果肩拍通知的 `ChangeNumber` 屬性值高於該 `Branch` 屬性值所儲存的最新值，請處理該肩拍通知，然後更新最新的 `ChangeNumber` 屬性值。

* 如果肩拍通知的 `ChangeNumber` 屬性值沒有高於該 `Branch` 屬性值的最新值，請略過處理該肩拍通知。該工作階段變更已經處理過了。

<Note>`ChangeNumber` 屬性值必須依 `Branch` 屬性值追蹤，而不是依工作階段追蹤。在工作階段的存留期內，`Branch` 屬性值可能會變更，並重設 `ChangeNumber` 屬性值。</Note>

[返回本主題頂端。](#top)

<a id="cams" />

## 建立 MPSD 工作階段

<Note>根據預設，MPSD 工作階段會在第一位成員加入時建立。如果您的遊戲邏輯預期在加入時遊戲存在或不存在，可以在工作階段更新期間將適當的寫入模式值傳遞給寫入方法。</Note>

遊戲必須執行下列動作來建立新的工作階段。

1. 建立新的 `XblContextHandle` 物件。您的遊戲只需建立此物件一次並加以儲存，然後在整個原始程式碼中視需要重複使用。必須使用完全相同的內容，尤其是在處理工作階段訂閱時。

2. 使用 [XblMultiplayerSessionCreateHandle](/zh-TW/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessioncreatehandle) 建立新的 `XblMultiplayerSessionHandle`，以準備 MPSD 建立新工作階段所需的所有工作階段資料。

3. 在將工作階段寫入 MPSD 之前進行必要的變更。例如，呼叫 [XblMultiplayerSessionJoin](/zh-TW/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessionjoin) 將成員加入工作階段時，用戶端會新增隱藏的本機要求資料，告知 MPSD 在呼叫更新工作階段時進行加入。

4. 完成本機變更後，依照本主題中[更新 MPSD 工作階段](#update-an-mpsd-session)一節的說明，將變更寫入 MPSD。

5. 從 MPSD 接收已填入許多欄位的新 `XblMultiplayerSessionHandle` 物件。

6. 往後請使用新的工作階段物件。捨棄包含建立新工作階段之隱藏要求的舊複本。

### 範例

**Flat C API**

```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();
}
```

如需詳細資訊，請參閱下列內容：

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

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

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

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

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

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

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

[返回本主題頂端。](#top)

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

## 為 MPSD 工作階段設定仲裁者

遊戲會使用下列程序，為已建立的工作階段設定仲裁者。

<Note>在成員加入工作階段並包含其安全裝置位址之前，無法取得成員 (可能的主機) 的裝置權杖。</Note>

1. 呼叫 [XblMultiplayerSessionMembers](/zh-TW/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessionmembers)，從 MPSD 擷取主機候選項目的裝置權杖。

   > \[!NOTE]
   > 如果工作階段是由 SmartMatch 配對建立的，您的用戶端可以呼叫 [XblMultiplayerSessionHostCandidates](/zh-TW/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessionhostcandidates)，使用 MPSD 提供的主機候選項目。

2. 從主機候選項目清單中選取所需的主機。

3. 呼叫 [XblMultiplayerSessionSetHostDeviceToken](/zh-TW/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessionsethostdevicetoken)，在 MPSD 的本機快取中設定裝置權杖。如果設定主機裝置權杖的呼叫成功，本機裝置權杖就會取代主機的權杖。

4. 如果在嘗試設定主機裝置權杖時收到 HTTP/412 狀態碼，請查詢工作階段資料。查看主機裝置權杖是否屬於本機主機。如果不屬於本機主機，表示已指定另一部主機作為仲裁者。

   > \[!NOTE]
   > 您的用戶端應該將 HTTP/412 狀態碼與其他 HTTP 狀態碼分開處理，因為 HTTP/412 並不表示標準失敗。如需此狀態碼的詳細資訊，請參閱[多人遊戲工作階段狀態碼](/zh-TW/services/xbox-services/multiplayer/mpsd/how-to/live-mpsd-status-codes)。

5. 依照本主題中[更新 MPSD 工作階段](#update-an-mpsd-session)一節的說明，在 MPSD 中更新工作階段。

   > \[!NOTE]
   > 如果您沒有更好的演算法，用戶端可以實作貪婪演算法，讓每個主機候選項目在尚未有其他人這麼做時，嘗試將自己設為主機。如需詳細資訊，請參閱「多人遊戲工作階段進階主題」主題中的[工作階段仲裁者](/zh-TW/services/xbox-services/multiplayer/mpsd/concepts/live-mpsd-details#session-arbiter)一節。

[返回本主題頂端。](#top)

<a id="mta" />

## 管理遊戲啟用

XBOX One (或更新版本) 會在通訊協定啟用期間引發 `CoreApplicationView.Activated` 事件。
在多人遊戲 API 的內容中，當使用者接受邀請或加入其他使用者時，就會引發此事件。
這些動作會觸發啟用，遊戲必須做出回應，讓加入的使用者與目標使用者一起進入遊戲。

<Note>您的遊戲應該隨時預期會有新的啟用引數，且絕不應該針對長度撰寫程式碼。</Note>

遊戲必須執行下列主要步驟來處理遊戲啟用。

1. 為 `CoreApplicationView.Activated` 事件設定事件處理常式。即使遊戲已在執行中，每次發生通訊協定啟用時都會觸發此處理常式。

2. 在遊戲啟用時，開始工作階段並訂閱工作階段變更通知。如需詳細資訊，請參閱本主題中的[訂閱 MPSD 工作階段變更通知](#sfmscn)。

3. 以作用中身分將使用者加入工作階段。如需詳細資訊，請參閱本主題中的[從遊戲啟用加入 MPSD 工作階段](#jamsfata)。

4. 將大廳工作階段設為透過設定檔 UI 公開的活動工作階段。如需詳細資訊，請參閱本主題中的[設定使用者目前的活動](#stuca)。

5. 以作用中身分將使用者加入遊戲工作階段。使用者現在可以連線至對等節點，並進入遊戲或大廳。

下列流程圖顯示如何處理遊戲啟用。

<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="流程圖影像，顯示如何處理遊戲啟用。" width="982" height="1272" data-path="images/gdk/services/Multiplayer_2015_OnActivation.png" />

[返回本主題頂端。](#top)

<a id="mtuj" />

## 讓使用者可被加入

若要讓使用者可被加入，遊戲必須執行下列動作：

1. 建立工作階段物件，然後視需要修改屬性。

2. 以作用中身分將使用者加入工作階段。如需詳細資訊，請參閱本主題中的[從遊戲啟用加入 MPSD 工作階段](#jamsfata)。

3. 判斷使用者是否已被指定為工作階段仲裁者。

4. 如果使用者不是仲裁者，請移至步驟 7。

5. 如果使用者是仲裁者，請呼叫 [XblMultiplayerSessionSetHostDeviceToken](/zh-TW/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessionsethostdevicetoken)。

6. 嘗試呼叫 [XblMultiplayerWriteSessionAsync](/zh-TW/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayerwritesessionasync) 來寫入工作階段。

7. 將該工作階段設為作用中工作階段。如需詳細資訊，請參閱本主題中的[設定使用者目前的活動](#stuca)。

下列流程圖顯示在遊戲期間允許其他玩家加入使用者的步驟。

<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="流程圖影像，顯示在遊戲期間允許其他玩家加入使用者的步驟。" width="607" height="869" data-path="images/gdk/services/Multiplayer_2015_Become_Joinable.png" />

[返回本主題頂端。](#top)

<a id="sgi" />

## 傳送遊戲邀請

遊戲可以透過下列方式讓玩家傳送遊戲邀請。

* 傳送大廳工作階段的邀請。
* 使用一般 XBOX 平台邀請 UI 搭配遊戲工作階段參考來傳送邀請。

若要為玩家傳送遊戲邀請，遊戲必須執行下列動作：

1. 讓發出邀請的遊戲可供玩家加入。如需詳細資訊，請參閱本主題中的[讓使用者可被加入](#mtuj)。

2. 判斷要透過大廳工作階段或使用邀請 UI 傳送邀請。

3. 如果使用大廳工作階段，請呼叫 [XblMultiplayerSendInvitesAsync](/zh-TW/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersendinvitesasync) 傳送邀請。此方法可能需要呼叫 [XGameUiShowPlayerPickerAsync](/zh-TW/reference/system/xgameui/functions/xgameuishowplayerpickerasync) 來建立遊戲內 UI 名單。

4. 如果使用邀請 UI，請呼叫 [XGameUiShowSendGameInviteAsync](/zh-TW/reference/system/xgameui/functions/xgameuishowsendgameinviteasync) 以顯示邀請 UI。

5. 在遠端玩家加入後，為本機玩家處理 [XblMultiplayerAddSessionChangedHandler](/zh-TW/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayeraddsessionchangedhandler)。

6. 針對遠端玩家，實作遊戲啟用程式碼。如需詳細資訊，請參閱本主題中的[管理遊戲啟用](#mta)。

下列流程圖顯示如何傳送邀請。

<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="流程圖影像，顯示如何傳送邀請。" width="922" height="736" data-path="images/gdk/services/Multiplayer_2015_Send_Invites.png" />

[返回本主題頂端。](#top)

<a id="jagsfals" />

## 從大廳工作階段加入遊戲工作階段

如果 Windows 10 裝置上的遊戲工作階段不是大型工作階段，就必須將 `userAuthorizationStyle` 功能設為 `true`。因此，`joinRestriction` 屬性不能是 `none`，這表示工作階段無法直接公開加入。

常見的情境是建立大廳工作階段來聚集玩家，然後將這些玩家移至遊戲工作階段或配對工作階段。但如果遊戲工作階段無法公開加入，遊戲用戶端就無法加入遊戲工作階段，除非符合 `joinRestriction` 設定。在大多數情況下，這對此情境而言限制過多。

解決方法是使用轉移控制代碼來連結大廳工作階段與遊戲工作階段。遊戲可以執行下列動作來達成此目的：

1. 建立遊戲工作階段時，使用 [XblMultiplayerSetTransferHandleAsync](/zh-TW/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersettransferhandleasync) API 建立連結大廳工作階段與遊戲工作階段的轉移控制代碼。

2. 將轉移控制代碼 GUID 儲存在大廳工作階段中，而不是儲存遊戲工作階段的工作階段參考。

3. 當遊戲想要將成員從大廳工作階段移至遊戲工作階段時，每個用戶端都會使用來自大廳工作階段的轉移控制代碼，透過 [XblMultiplayerWriteSessionByHandleAsync](/zh-TW/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayerwritesessionbyhandleasync) API 加入遊戲工作階段。

4. MPSD 會查閱大廳工作階段，以驗證嘗試使用轉移控制代碼加入遊戲工作階段的成員也在大廳工作階段中。

5. 如果成員在大廳工作階段中，他們就可以存取遊戲工作階段。

[返回本主題頂端。](#top)

<a id="jamsfata" />

## 從遊戲啟用加入 MPSD 工作階段

當使用者透過 XBOX 殼層 UI 選擇加入好友的活動或接受邀請時，遊戲會以指出使用者想要加入哪個工作階段的參數啟用。遊戲必須處理此啟用，並將使用者新增至對應的工作階段。

以下是遊戲應遵循的步驟。

1. 為 `CoreApplicationView.Activated` 事件實作事件處理常式。它會通知遊戲的啟用。

2. 處理常式引發時，請檢查 `IActivatedEventArgs.Kind` 屬性。如果設為 `Protocol`，請將事件引數轉換為 `ProtocolActivatedEventArgs` 類別。

3. 檢查 `ProtocolActivatedEventArgs` 物件。如果 `ProtocolActivatedEventArgs.Uri` 屬性中指出的 URI 符合 `inviteHandleAccept` (對應已接受的邀請) 或 `activityHandleJoin` (對應透過殼層 UI 加入)，請剖析 URI 的查詢字串。它的格式是具有索引鍵/值組的一般 URI 查詢字串，請從中擷取下列欄位。
   * 針對已接受的邀請：
     1. `handle`
     2. `invitedXuid`
     3. `senderXuid`
   * 針對加入：
     1. `handle`
     2. `joinerXuid`
     3. `joineeXuid`

4. 啟動遊戲的多人遊戲程式碼，其中應包括呼叫 [XblMultiplayerSetSubscriptionsEnabled](/zh-TW/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersetsubscriptionsenabled)。

5. 呼叫 [XblMultiplayerSessionCreateHandle](/zh-TW/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessioncreatehandle) 建立本機 `XblMultiplayerSessionHandle` 物件。

6. 呼叫 [XblMultiplayerSessionJoin](/zh-TW/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessionjoin) 加入工作階段。請使用下列參數設定，讓加入設為作用中。
   * `memberCustomConstantsJson` = `null`
   * `initializeRequested` = `false`
   * `joinWithActiveStatus` = `true`

7. 呼叫 [XblMultiplayerSessionSetSessionChangeSubscription](/zh-TW/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessionsetsessionchangesubscription)，以便在加入後工作階段變更時收到肩拍通知。

8. 使用步驟 3 中取得的控制代碼呼叫 [XblMultiplayerWriteSessionByHandleAsync](/zh-TW/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayerwritesessionbyhandleasync)。使用者現在是工作階段的成員，可以使用工作階段中的資料連線至遊戲。

[返回本主題頂端。](#top)

<a id="stuca" />

## 設定使用者目前的活動

使用者目前的活動會顯示在遊戲的 XBOX 儀表板使用者體驗中。使用者的活動可以透過工作階段或遊戲啟用來設定。在後者的情況下，使用者會透過配對或開始遊戲進入工作階段。

<Note>透過工作階段設定的活動，可以呼叫 [XblMultiplayerClearActivityAsync](/zh-TW/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayerclearactivityasync) 來刪除。</Note>

若要將工作階段設為使用者目前的活動，遊戲會呼叫 [XblMultiplayerSetActivityAsync](/zh-TW/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersetactivityasync)，並傳遞該工作階段的工作階段參考。

若要透過遊戲啟用設定使用者目前的活動，請參閱本主題中的[從遊戲啟用加入 MPSD 工作階段](#jamsfata)。

[返回本主題頂端。](#top)

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

## 更新 MPSD 工作階段

<Note>當您的遊戲使用多人遊戲 API 更新現有工作階段時，請記住，在呼叫寫入工作階段之前，它處理的都是本機複本。</Note>

若要更新現有的工作階段，遊戲必須執行下列動作：

1. 視需要對目前的工作階段進行變更，例如呼叫 [XblMultiplayerSessionLeave](/zh-TW/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessionleave)。

2. 完成所有變更後，使用下列任一方法將本機變更寫入 MPSD。

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

   如果您寫入的是其他遊戲也可以修改的共用部分，請將寫入模式設為 [XblMultiplayerSessionWriteMode](/zh-TW/reference/live/xsapi-c/multiplayer_c/enums/xblmultiplayersessionwritemode)`::SynchronizedUpdate`。如需詳細資訊，請參閱「多人遊戲工作階段目錄概觀」主題中的[工作階段更新的同步處理](/zh-TW/services/xbox-services/multiplayer/mpsd/live-mpsd-overview#synchronization-of-session-updates)一節。

   寫入方法會將加入寫入伺服器，並取得最新的工作階段，從中探索其他工作階段成員及其主機的安全裝置位址 (SDA)。如需在這些主機之間建立網路連線的詳細資訊，請參閱 XBOX One 上的 Winsock 簡介。

3. 捨棄舊的本機工作階段物件。使用新擷取的工作階段物件，讓後續動作以最新的已知工作階段狀態為基礎。

[返回本主題頂端。](#top)

<a id="lams" />

## 離開 MPSD 工作階段

若要允許使用者離開工作階段，遊戲必須執行下列動作：

1. 為遊戲工作階段呼叫 [XblMultiplayerSessionLeave](/zh-TW/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessionleave)。

2. 依照本主題中[更新 MPSD 工作階段](#update-an-mpsd-session)一節的說明，在 MPSD 中更新遊戲工作階段。

3. 必要時，為大廳工作階段呼叫 `XblMultiplayerSessionLeave` 方法，然後更新該工作階段。

4. 如果大廳工作階段有需要，請呼叫 [XblMultiplayerRemoveSubscriptionLostHandler](/zh-TW/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayerremovesubscriptionlosthandler) 與 [XblMultiplayerRemoveSessionChangedHandler](/zh-TW/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayerremovesessionchangedhandler) 取消註冊，以關閉多人遊戲 API。

下列流程圖顯示如何離開工作階段並關閉多人遊戲。

<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="流程圖影像，顯示如何離開工作階段並關閉多人遊戲。" width="694" height="787" data-path="images/gdk/services/Multiplayer_2015_Shut_Down.png" />

[返回本主題頂端。](#top)

<a id="fossdm" />

## 在配對期間填補開放的工作階段位置

若要在配對期間填補票證工作階段中的開放位置，遊戲必須遵循類似下列的步驟：

1. 存取配對期間所建立之票證工作階段的最新工作階段狀態。

2. 從大廳工作階段新增可供遊戲的玩家。

3. 判斷票證工作階段是否已滿。

4. 如果工作階段已滿，請繼續遊戲。

5. 如果工作階段尚未滿，請依照本主題中[建立對戰票證](#camt)的說明建立對戰票證。請務必在建立票證時將 `preserveSession` 參數設為 `Always`。

6. 繼續進行配對。如需詳細資訊，請參閱[配對概觀](/zh-TW/services/xbox-services/multiplayer/matchmaking/live-matchmaking-overview)。

下列流程圖顯示如何在配對期間填補開放的工作階段位置。

<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="流程圖影像，顯示如何在配對期間填補開放的工作階段位置。" width="794" height="716" data-path="images/gdk/services/Multiplayer_2015_Fill_Open_Slots.png" />

[返回本主題頂端。](#top)

<a id="camt" />

## 建立對戰票證

若要建立對戰票證，配對偵察者必須執行下列動作：

1. 呼叫 [XblMatchmakingCreateMatchTicketAsync](/zh-TW/reference/live/xsapi-c/matchmaking_c/functions/xblmatchmakingcreatematchticketasync)，並傳入票證工作階段的參考。此方法會從 MPSD 讀取票證工作階段，並為工作階段中的使用者開始配對。在內部，此方法會呼叫 `POST (/serviceconfigs/{scid}/hoppers/{hoppername})`。

2. 如果配對服務要將工作階段的成員配對至新的工作階段或另一個現有的工作階段，請將 `preserveSession` 參數設為 `Never`。將 `preserveSession` 參數設為 `Always`，可讓遊戲重複使用現有的遊戲工作階段作為票證工作階段以繼續遊戲。配對服務接著可以確保保留已提交的工作階段，並將任何配對到的玩家新增至該工作階段。

3. 使用 `CreateMatchTicketResponse` 物件中傳回的 [XblCreateMatchTicketResponse](/zh-TW/reference/live/xsapi-c/matchmaking_c/structs/xblcreatematchticketresponse)`::EstimatedWaitTime`，設定使用者對配對時間的預期。

4. 必要時，使用回應物件中傳回的 [XblCreateMatchTicketResponse](/zh-TW/reference/live/xsapi-c/matchmaking_c/structs/xblcreatematchticketresponse)`::MatchTicketId`，透過刪除票證來取消工作階段的配對。刪除票證會使用 [XblMatchmakingDeleteMatchTicketAsync](/zh-TW/reference/live/xsapi-c/matchmaking_c/functions/xblmatchmakingdeletematchticketasync)。

[返回本主題頂端。](#top)

<a id="gmts" />

## 取得對戰票證狀態

您的遊戲應該執行下列動作來擷取對戰票證狀態。

1. 取得票證工作階段的 `XblMultiplayerSessionHandle` 物件。

2. 呼叫 [XblMultiplayerSessionMatchmakingServer](/zh-TW/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessionmatchmakingserver)，以存取配對中使用的 [XblMultiplayerMatchmakingServer](/zh-TW/reference/live/xsapi-c/multiplayer_c/structs/xblmultiplayermatchmakingserver) 物件。

3. 檢查 `XblMultiplayerMatchmakingServer` 物件，以判斷配對程序的狀態、工作階段的一般等候時間，以及目標工作階段參考 (如果已找到對戰)。


## Related topics

- [多人遊戲工作階段目錄 (MPSD)](/zh-TW/services/xbox-services/multiplayer/mpsd/live-mpsd-nav.md)
- [多人遊戲工作階段瀏覽](/zh-TW/services/xbox-services/multiplayer/concepts/live-session-browse.md)
- [多人遊戲工作階段目錄 (MPSD) 概念](/zh-TW/services/xbox-services/multiplayer/mpsd/concepts/live-mpsd-concepts-nav.md)
- [多人遊戲工作階段範本](/zh-TW/services/xbox-services/multiplayer/mpsd/concepts/live-session-templates.md)
- [多人遊戲工作階段目錄概觀](/zh-TW/services/xbox-services/multiplayer/mpsd/live-mpsd-overview.md)
