我正在尝试构建一个实时多人游戏,现在我正在探索谷歌为多人游戏提供的示例游戏。链接是......
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或4rh玩家(因为我在MAX_OPPONENTS中设置)并且游戏立即以2名玩家(1名对手)开始。我想在这里添加计时器,并在指定的时间后开始游戏。
并且令人惊讶地在创建房间之后MIN_PLAYER值dose'nt在此代码中完全适用于默认房间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。
答案 0 :(得分:0)
自动匹配算法不会非常努力地最大化匹配中的玩家数量 - 如果你将min设置为1并且max设置为3,则可以获得2人游戏。
在这种情况下你应该做的是将MIN_OPPONENTS和MAX_OPPONENTS设置为3,并从你的代码处理游戏开始逻辑。
如果您想要实现此计时器逻辑,则无法使用我们的内置等候室UI,因为它不支持基于时间提前开始游戏。所以,相反,用这个逻辑实现你自己的候诊室:
启动计时器。
当您看到通过onPeerConnected()和onPeerDisconnected()以及其他回调连接或断开对等体时,在屏幕上显示进度。请参阅RoomStatusListener和RoomStatusUpdateListener。
当计时器到期时,决定你要做什么。例如,如果连接了2个以上的玩家,则启动游戏。如果没有,请等待更长时间,放弃等等。
当有人加入游戏时处理此案。如果2名玩家加入,计时器到期,游戏开始,然后第3或第4名玩家出现,就会发生这种情况。确保体验对他们来说并不可怕(不要只是踢它们):-)如果你不能将它们整合到正在进行的游戏中,你可以让它们保持“观众模式”并加入下一轮/匹配/等
重要提示:请记住,不同玩家的计时器在上述逻辑中不会同步 - 所以当您决定开始游戏时,您应该向所有同伴发送实时可靠的消息,让他们知道游戏正在开始,他们应该移动到游戏屏幕。
如果逻辑变得更复杂,选择“服务器”可能是有意义的。例如,您可以通过说具有最低Participant ID(按字典顺序)的客户端是服务器来执行此操作。说“谁创造了游戏就是服务器”并不好,因为在自动匹配时,每个人都认为他们创造了游戏。
我希望这有帮助!
答案 1 :(得分:-1)
刚刚看到here的摘录,其他人可能会对您的问题感兴趣:
getRealTimeWaitingRoomIntent()中的第二个参数表示 在开始之前必须在房间中连接的玩家数量 显示播放选项。在示例中,我们指定MAX_VALUE 表示从不显示“开始播放”选项。 相反,等候室UI会在所有玩家都自动退出 连接。
因此,如果您在使用内置等候室意图时没有设置MAX_VALUE,那么如果他将以最少的玩家开始游戏,或者等待更多人加入,您可以留给玩家。