我有一些问题在文档中没有得到解答: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游戏服务)
我有其他问题,但我不想问不必要的问题。这些问题非常有用,如果得到回答,会大大减轻我的压力。
感谢您的时间。
答案 0 :(得分:6)
1)这与谷歌打算完全一样。没有保证,如果你使用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");
}
然后,这将关闭等候室中等待的所有玩家的等候室,并让他们回到您的活动中。从下面,如果您想要"开始播放"的行为,这只有在邀请的玩家已经接受邀请进入房间时。 (如果谷歌意味着它以另一种方式为AutoMatch工作,他们还没有在那里得到它)
public Intent getRealTimeWaitingRoomIntent(Room room,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,则调用者有责任仔细检查房间的当前状态并决定是开始游戏,继续等待还是做其他事情。但请注意,当候诊室处于活动状态时,会议室的状态将随着参与者接受或拒绝邀请而改变,参与者的数量甚至可能会随着自动匹配玩家的添加而改变。
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。 参数 房间完全连接的房间对象。如果无法成功加载,房间可以为空。