使用多人游戏管理器处理协议激活以启动游戏

此主题描述了使用多人游戏管理器处理协议激活。

激活 指系统为响应其他操作自动启动游戏。 此操作通常在玩家接受其他玩家的游戏邀请时执行。

你的游戏可通过以下方式实现协议激活。

  • 用户接受游戏邀请
  • 用户从某个玩家的玩家卡片选择“加入游戏”。

此方案介绍了在启动游戏、玩家加入大厅和游戏正在进行(如果游戏存在)时如何处理协议激活。

关于协议激活流程的流程图,请参阅 处理协议激活(流程图)

当玩家通过玩家的玩家卡片接受游戏邀请或加入好友的游戏时,使用协议激活在其设备上启动游戏。 游戏启动后,可通过使用 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)。
  • 设置成员属性。
  • 注册会话更改事件。
  • 将大厅会话设置为活动会话。
  • 加入游戏会话(如果存在)。
  • 使用传输句柄。