2

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

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。

4

2 回答 2

0

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

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

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

  1. 启动你的计时器。

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

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

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

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

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

我希望这有帮助!

于 2013-05-28T21:58:37.843 回答
-1

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

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

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

于 2013-08-18T17:04:12.283 回答