Google Play 实时多人游戏问题
Posted
技术标签:
【中文标题】Google Play 实时多人游戏问题【英文标题】:Google Play Realtime Multiplayer Questions 【发布时间】:2014-03-08 10:41:24 【问题描述】:我有一些问题没有在文档中得到解答:https://developers.google.com/games/services/android/multiplayer
RoomConfig.createAutoMatchCriteria(1, 3, 0)
无法按预期工作。它只会尝试匹配 2 人游戏,从不匹配 3,永远不会匹配 4。我只有 3 个设备,但我花了大约 2 个小时尝试匹配设备,而且它们只是成对完成的。我读了这篇文章:Auto Match Criteria in Google Multiplayer Sample BittonClicker Game for android 有类似的问题。 GamesClient.getSelectPlayersIntent(1, 3)
也有同样的错误。
GamesClient.getRealTimeWaitingRoomIntent(room, 0)
无法按预期工作。文档指出“如果连接的参与者数量大于或等于指定的最小开始游戏,则启用等候室 UI 中的开始播放选项。”但是在测试后,我还没有看到“开始播放”选项。发生的情况是,当第一个人在弹出“准备播放”的消息后连接时,等候室会自动退出。从 0 更改为 1 具有相同的效果,更改为 Integer.MAX_VALUE
也是如此。谁能提供一种实现预期功能的方法?我在这里做错了吗?
我在 android 上玩过一些多人游戏,用户加入,然后离开,其他人取代他们的位置。无论我为自动化假设什么参数,我都无法在测试中看到这一点。如果一名球员离开房间,另一名球员会来填补他的位置吗?如果是这样,`Room.getParticipantIds().size() 会返回一个大于 4 的数字吗?
在其中一些游戏中,一旦游戏开始,就没有其他人加入。我已经测试了这些游戏,但有一次没有发现我加入了一个房间并被告知它正在进行中。他们是否以某种方式告诉服务器游戏已经开始,而不是让他们与其他玩家匹配?其他玩家怎么只加入还没开始的游戏呢? (这些游戏使用 Google Play 游戏服务)
我还有其他问题,但我不想问不必要的问题。这些问题会很有帮助,如果得到解答,我的压力会大大减轻。
感谢您的宝贵时间。
【问题讨论】:
【参考方案1】:1) 这完全符合 Google 的预期。无法保证如果您使用 createAutoMatchCriteria(1, 3, 0) 会为您的游戏找到 3 个对手。在我的测试中,(4 台设备同时请求)90% 或更多的时间它将变成 2 游戏 2 开始。仅当我有一个设备邀请朋友或手动选择 AutoPick 时,启动 3 或 4 人游戏的机会才会显着增加(否则,纯 AutoMatch 会导致 2 和 2 行为)
2) 如果我对行为的理解正确,您会看到一个玩家离开等候室(通常是首先启动的设备),然后另一个玩家加入,但第一个玩家离开等候室,另一个玩家离开在里面?如果是这样,那么您需要确保使用以下内容(我在 onRoomConnected 中使用
try
bWaitRoomDismissedFromCode = true;
finishActivity(RC_WAITING_ROOM);
catch (Exception e)
dLog("would have errored out in waiting room");
这将为仍在等候室中的所有玩家关闭等候室,并让他们重新开始您的活动。从下面看,如果你想要“开始玩”的行为,这只有在有被邀请的玩家接受了邀请进入房间的情况下。 (如果 Google 打算让它以另一种方式用于 AutoMatch,他们还没有实现)
public Intent getRealTimeWaitingRoomIntent(房间房间,int minParticipantsToStart)
返回将显示“等候室”屏幕的意图,该屏幕显示参与者加入实时多人游戏房间的进度。注意这里必须用startActivityForResult(Intent, int)调用,这样才能建立调用包的身份。
如果必要数量的对等点已连接并且现在可以开始游戏,或者如果用户明确要求现在开始游戏,则活动结果将为 RESULT_OK。如果用户在没有采取任何行动的情况下退出等候室屏幕,结果将为 RESULT_CANCELED。如果用户明确选择离开房间,结果将是 RESULT_LEFT_ROOM。
无论结果代码是什么,等候室活动都会返回一个数据意图,其中包含 EXTRA_ROOM 中的 Room 对象,该对象表示您最初在此处作为参数传递的 Room 的当前状态。
如果需要,等候室可以允许用户在房间完全连接之前开始玩游戏。这由 minParticipantsToStart 参数控制:如果至少有那么多参与者(包括当前玩家)连接到房间,“开始播放”菜单项将在等候室 UI 中启用。将 minParticipantsToStart 设置为 0 意味着“开始播放”将始终可用,而 MAX_VALUE 的值将完全禁用该项目。注意:如果您确实允许用户提前开始,您需要通过明确告诉其他连接的对等方游戏现在开始来处理这种情况;有关详细信息,请参阅开发者文档。
最后,请注意,等候室本身永远不会明确采取任何行动来更改房间或其参与者的状态。因此,如果活动结果为 RESULT_LEFT_ROOM,则实际离开房间是调用者的责任。或者如果结果是 RESULT_CANCELED,调用者有责任仔细检查 Room 的当前状态并决定是开始游戏、继续等待还是做其他事情。但请注意,当等候室处于活动状态时,房间的状态会随着参与者接受或拒绝邀请而改变,参与者的数量甚至会随着自动匹配玩家的加入而改变。
3) Google Play 游戏服务(用于自动匹配)没有这种行为。只有当一个房间的所有参与者都被服务器找到并选中后,房间才会真正被连接(onRoomCreated 并不意味着已经建立了一个用于通信的房间,是等待其他人加入的玩家加入...并且可以在服务拥有所有其他玩家时切换)onRoomConnected 是对所有连接玩家的最后一次调用,表示房间已准备好传递消息。现在,如果您有被邀请者,行为会发生变化,是的,您可以看到被邀请者接受,但如果他们随后离开房间.. 无法通过 AutoMatch 填充它,但您可以看到他们离开。 ..(多好啊?)
4)如果游戏使用的是 GPGS,那么一旦创建了一个房间并将其设置为 onRoomConnected 阶段,它就会开始播放,并且无法在该房间进行更多的比赛。因此,当您加入一个房间时,其他所有人都同时加入了。因此,当玩家离开时,其他人将无法加入。
public abstract void onRoomConnected (int statusCode, Room room)
当实时房间中的所有参与者完全连接时调用。一旦接受了所有邀请并且完成了任何必要的自动化,就会调用它。可能的状态码包括:
STATUS_OK 如果数据已成功加载并且是最新的。 STATUS_CLIENT_RECONNECT_REQUIRED 如果客户端需要重新连接到服务以访问此数据。 STATUS_INTERNAL_ERROR 如果服务中发生意外错误。 参数 room 完全连接的房间对象。无法加载成功的房间可以为空。
【讨论】:
欣赏答案,尤其是第 3 条。我认为这些信息将对很多人有很大帮助。以上是关于Google Play 实时多人游戏问题的主要内容,如果未能解决你的问题,请参考以下文章
如何在实时多人游戏中移动对象? (统一的 Google Play 游戏插件)
如何检测客户端是不是故意离开 Google Play 游戏实时多人游戏中的房间?
当应用程序进入后台时,实时多人 Google Play 游戏服务对等方断开连接
Google Play 游戏服务 - 实时多人游戏 - STATUS_CLIENT_RECONNECT_REQUIRED