接收邀请
使用本主题将游戏邀请添加到 Xbox 服务游戏。 为了让你的游戏收到多人游戏邀请,需要注册多人游戏协议和游戏邀请回调。 你的游戏接收本地用户的邀请,然后将该用户加入多人游戏会话。
先决条件
若要在 Windows 电脑上接收游戏邀请通知,请安装 Xbox 游戏栏。 默认情况下,Xbox 游戏栏应用安装在 Windows 10,操作系统版本 1903 或更高版本上。 选择Windows 徽标键+G启动 Xbox 游戏栏应用,以验证其是否正确安装。
注意
如果 Windows 电脑上未安装 Xbox Game Bar,则可以从 Microsoft Store安装。
注册多人游戏协议
注册多人游戏协议可告知系统在用户接受多人游戏邀请时如何启动游戏。
要注册多人游戏协议,需要将一个 MultiplayerProtocol
元素添加到 MicrosoftGame.config 文件,如以下代码所示。
<MultiplayerProtocol>true</MultiplayerProtocol>
如果包中有多个可执行文件,则可以使用 Executable
属性指定哪个可执行文件应处理多人游戏协议,如以下代码所示。
<MultiplayerProtocol Executable="MyExecutableForMultiplayer.exe">true</MultiplayerProtocol>
注册多人游戏邀请回调
要接收多人游戏邀请回调,需使用 XGameInviteRegisterForEvent API 注册游戏邀请回调,如以下代码所示。
有关注册和注销游戏邀请回调的详细信息,请参阅 XVentInistereRegisterForEvent 和 XVentInventeUnregisterForEvent。
平面 C
#include <XTaskQueue.h>
#include <XGameInvite.h>
XTaskQueueHandle g_taskQueue;
XTaskQueueRegistrationToken g_gameInviteEventToken;
void OnGameInvite(void* context, const char* inviteUri)
{
if (inviteUri != nullptr)
{
std::string inviteString(inviteUri);
auto pos = inviteString.find("handle=");
auto handleId = inviteString.substr(pos + 7, 36);
// Now call XblMultiplayerManagerJoinLobby
}
}
void InitializeGame()
{
XGameInviteRegisterForEvent(g_taskQueue, nullptr, OnGameInvite, &g_gameInviteEventToken);
}
void ShutdownGame()
{
XGameInviteUnregisterForEvent(g_gameInviteEventToken);
}
若要正确处理“从暂停状态接受邀请”情况,游戏必须存储inviteUri
从XGameInviteRegisterForEvent 回调传入上述示例代码中 OnGameInvite()
的处理方法。 然后,游戏必须等待通知,RegisterAppStateChangeNotification
当其完全恢复时, 通过使用在 inviteUri
中提供的详细信息,游戏才继续在会话中操作。
有关 RegisterAppStateChangeNotification
的详细信息,请参阅 Xbox 游戏生命周期(NDA 主题)要求授权。
Parsing inviteUrl from XGameInviteEventCallback
当你的游戏收到 XGameInviteEventCallback 事件时,你将访问 inviteUrl
字符串。
inviteUrl
是以下格式之一。
对于接受游戏邀请
当用户接受游戏邀请后,游戏通过 inviteUri
收到其邀请回调,如以下代码所示。
"ms-xbl-multiplayer://inviteHandleAccept?handle=%s&invitedXuid=%s&senderXuid=%s&context=%s"
// for example:
// "ms-xbl-multiplayer://inviteHandleAccept?handle=00000000-0000-1234-5678-1234567890ab&invitedXuid=1234567890123456&senderXuid=6543210987654321&context="
URI 始终以"ms-xbl-startser/"开头,然后为以下句柄。
-
inviteHandleAccept
指示因为用户接受了游戏邀请,回调已启动。 -
handle
是你用来加入多人游戏会话的邀请句柄。 -
invitedXuid
是受邀参加多人游戏会话的 Xbox 服务用户的 ID。 -
senderXuid
是已发送游戏邀请的 Xbox 服务用户的 ID。 -
context
是发送者可能已包括的附加(可选)上下文。
对于加入进行中的游戏会话
当用户尝试加入多人游戏会话时,游戏将使用 inviteUri
接收游戏邀请回调,如下代码所示。
"ms-xbl-multiplayer://activityHandleJoin?&handle=%s&joinerXuid=%s&joineeXuid=%s"
URI 始终以"ms-xbl-startser/"开头,然后为以下句柄。
-
activityHandleJoin
指示因为用户接受了游戏邀请,回调已启动。 -
handle
是你用于加入多人游戏会话的活动句柄。 -
joinerXuid
是尝试加入多人游戏会话的 Xbox 服务用户的 ID。 -
joineeXuid
是目前已在多人游戏会话中的 Xbox 服务用户的 ID。
加入使用句柄的多人游戏会话
使用多人游戏管理器
如果你正在使用多人游戏管理器,则可以使用 XblMultiplayerManagerJoinLobby API 传入从 inviteUrl
提取的 handleId
,将用户加入多人游戏会话。 还可对invitedXuid
使用 xblUserHandle
,如以下代码所示。
平面 C
HRESULT hr = XblMultiplayerManagerJoinLobby(handleId, xblUserHandle);
直接使用多人游戏 API
如果你正在使用多人游戏API,请使用以下步骤来配置多人游戏会话和游戏邀请。
- 使用 XblMultiplayerGetSessionByHandleAsync API 提取多人游戏会话文档,然后传入
handleId
。 - 使用 XblMultiplayerSessionJoin API 将本地用户加入多人游戏会话文档。
- 使用 XblMultiplayerWriteSessionByHandleAsync API 将多人游戏会话文档写入服务,以提交此更改。