使用多人游戏管理器处理协议激活以启动游戏
此主题描述了使用多人游戏管理器处理协议激活。
激活 指系统为响应其他操作自动启动游戏。 此操作通常在玩家接受其他玩家的游戏邀请时执行。
你的游戏可通过以下方式实现协议激活。
- 用户接受游戏邀请
- 用户从某个玩家的玩家卡片选择“加入游戏”。
此方案介绍了在启动游戏、玩家加入大厅和游戏正在进行(如果游戏存在)时如何处理协议激活。
关于协议激活流程的流程图,请参阅 处理协议激活(流程图)。
当玩家通过玩家的玩家卡片接受游戏邀请或加入好友的游戏时,使用协议激活在其设备上启动游戏。 游戏启动后,可通过使用 XGameInviteRegisterForEvent 获取邀请句柄。 使用邀请句柄,调用 XblMultiplayerManagerJoinLobby。
如果未通过 XblMultiplayerManagerLobbySessionAddLocalUser 添加受到邀请的用户,则 XblMultiplayerManagerJoinLobby 将失败,并通过使用 JoinLobbyCompleted
事件调用 XblMultiplayerEventArgsXuid 来提供为之发送邀请的 xuid。
加入大厅后,建议设置本地成员的连接地址,以及该成员的所有自定义属性。 如果不存在,也可以通过 XblMultiplayerManagerLobbySessionSetSynchronizedHost 设置主机。
最后,如果游戏已在进行并且还可以容纳被邀请者,则多人游戏管理器会自动将用户加入游戏会话。
通过 JoinGameCompleted
事件通知游戏,并提供适当的错误代码和消息。
扁平 C API
#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 inviteHandeId = inviteString.substr(pos + 7, 36);
// Now, call XblMultiplayerManagerJoinLobby.
}
}
void InitializeGame()
{
XGameInviteRegisterForEvent(g_taskQueue, nullptr, OnGameInvite, &g_gameInviteEventToken);
}
void ShutdownGame()
{
XGameInviteUnregisterForEvent(g_gameInviteEventToken);
}
HRESULT hr = XblMultiplayerManagerLobbySessionSetLocalMemberConnectionAddress(
xblUserHandle, connectionAddress, context);
有关详细信息,请参阅 XblMultiplayerManagerLobbySessionSetLocalMemberConnectionAddress。
多人游戏管理器执行以下功能。
- 注册实时活动和多人游戏订阅。
- 加入大厅会话。
- 现有大厅状态清理。
- 以活动身份加入所有本地玩家。
- 上传安全设备地址 (SDA)。
- 设置成员属性。
- 注册会话更改事件。
- 将大厅会话设置为活动会话。
- 加入游戏会话(如果存在)。
- 使用传输句柄。