房间配置在安卓的谷歌实时多人游戏服务中无法正常工作

Posted

技术标签:

【中文标题】房间配置在安卓的谷歌实时多人游戏服务中无法正常工作【英文标题】:Room Configuration did not work properly in google real time multiplayer services for android 【发布时间】:2013-05-22 10:18:17 【问题描述】:

我正在尝试构建一个实时多人游戏,现在我正在探索谷歌为多人提供的示例游戏。链接是...

https://github.com/playgameservices/android-samples/tree/master/ButtonClicker

问题是当我根据我的要求更改自动匹配标准配置时

void startQuickGame() 
final int MIN_OPPONENTS = 1, MAX_OPPONENTS = 3;
   Bundle autoMatchCriteria = RoomConfig.createAutoMatchCriteria(MIN_OPPONENTS,
           MAX_OPPONENTS, 0);
   RoomConfig.Builder rtmConfigBuilder = RoomConfig.builder(this);
   rtmConfigBuilder.setMessageReceivedListener(this);
   rtmConfigBuilder.setAutoMatchCriteria(autoMatchCriteria);
   rtmConfigBuilder.setRoomStatusUpdateListener(this);

   getGamesClient().createRoom(rtmConfigBuilder.build());

然后此代码不会等待房间中的第 3 位或第 4 位玩家(正如我在 MAX_OPPONENTS 中设置的那样),游戏会立即以 2 位玩家(1 个对手)开始。我想在这里添加计时器,游戏在指定时间之后开始。

令人惊讶的是,在创建房间后,MIN_PLAYER 值在默认房间 UI 的代码中根本不起作用。

   final int MIN_PLAYERS = 2;
   Intent i = getGamesClient().getRealTimeWaitingRoomIntent(room, MIN_PLAYERS);

   // show waiting room UI
   startActivityForResult(i, RC_WAITING_ROOM);

我的要求是,在创建房间后,我想等待特定时间,然后游戏从加入的玩家开始。无论是 2 、 3 还是 4 。

【问题讨论】:

【参考方案1】:

自动算法不会非常努力地最大化比赛中的玩家数量 - 如果您将 min 设置为 1 并将 max 设置为 3,则可以进行 2 人游戏。

在这种情况下,您应该将 MIN_OPPONENTS 和 MAX_OPPONENTS 设置为 3,并从您的代码中处理游戏启动逻辑。

如果你想实现这个计时器逻辑,你不能使用我们内置的等候室 UI,因为它不支持基于时间提前开始游戏。所以,相反,用这个逻辑来实现你自己的等候室:

    启动计时器。

    当您看到通过 onPeerConnected() 和 onPeerDisconnected() 以及其他回调连接或断开对等点时,在屏幕上显示进度。请参阅 RoomStatusListener 和 RoomStatusUpdateListener。

    当计时器到期时,决定你要做什么。例如,如果有 2 个以上的玩家连接,则开始游戏。如果没有,请等待更长的时间,放弃等等。

    处理有人迟到的情况。如果有 2 名玩家加入,计时器到期,游戏开始,然后出现第 3 或第 4 名玩家,则会发生这种情况。确保他们的体验不可怕(不要只是把他们踢出去):-) 如果你不能将他们整合到正在进行的游戏中,你可以让他们保持“旁观者模式”并加入下一轮/匹配/等。

重要提示:请记住,在上面的逻辑中,不同玩家的计时器不会同步 - 因此,当您决定开始游戏时,您应该向所有同伴发送实时可靠的消息,让他们知道游戏开始了,他们应该移动到游戏屏幕。

如果逻辑变得更复杂,选择“服务器”可能是有意义的。您可以这样做,例如,通过说具有最低参与者 ID(按字典顺序)的客户端是服务器。说“谁创造了游戏就是服务器”是不好的,因为在自动化时,每个人都认为他们创造了游戏。

我希望这会有所帮助!

【讨论】:

我已经按照您的解释进行了尝试,并且我正在使用自己的等候室 UI,但主要和令人惊讶的问题是)当我设置 MIN_OPPONENT= 2 或 3 时。游戏服务未尝试搜索玩家房间一一。我没有像 onPeerConnected() 那样收到我游戏中每个玩家的任何回电。但是如果有的话,谷歌播放服务会向我发送所有玩家的集体回电。女巫包括在MIN_OPPONENTS中设置的参与者总数(无论是1、2还是3)。 意思是直到游戏服务没有根据房间配置找到所有对手,它没有向我发送任何回叫。或者换句话说,它根据房间配置向我发送所有或没有对手。理想情况下,如果房间有任何可用的玩家,它应该通过回叫通知我并给我回叫。但这永远不会发生。如果我在任何方向上出错,请指导我。 @dani,你解决了吗?我面临同样的问题!我只有在所有匹配的玩家都连接时才会收到通知,而不是一个一个 这里也一样。每个玩家创建自己的房间,直到 google 看到有 4 个房间,每个房间有 1 个玩家并加入所有房间。 有人成功实现了这个概念吗?【参考方案2】:

刚刚看到here 的这段摘录,其他人可能会对您的问题感兴趣:

getRealTimeWaitingRoomIntent() 中的第二个参数表示 开始前必须在房间内连接的玩家数量 显示播放选项。在示例中,我们指定 MAX_VALUE 这表示从不显示开始播放选项。 相反,当所有玩家都离开时,等候室 UI 会自动退出 已连接。

因此,如果您在使用内置等候室 Intent 时没有设置 MAX_VALUE,您可以让玩家自己决定是否以最少的玩家开始游戏,或者等待更多人加入。

【讨论】:

您不能选择不指定 MAX_VALUE;这是一个必需的参数

以上是关于房间配置在安卓的谷歌实时多人游戏服务中无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

如何在实时多人游戏 Google Play 游戏服务中向其他参与者发送有关房间创建的数据

谷歌玩游戏实时多人游戏如何获得快速匹配玩家的名字?

谷歌玩游戏服务多人支持在两台设备上显示相同的数据[关闭]

Google Play 游戏服务 (GPGS) 实时多人游戏 (RTMP) 在 Android 上永远无法匹配(iOS 工作)

安卓回合制多人自定义邀请画面

实时多人房间创建进度卡在 20%