在iOS9中如何检测Game Center基于回合的匹配何时结束?

时间:2016-03-25 20:24:39

标签: ios game-center gkturnbasedmatch

我完全迷失了如何实现回合制游戏。我一直在尝试使用GKLocalPlayerListener方法来处理iOS9中的回合制。唯一可以触发的方法是receivedTurnEventForMatch,这使我没有任何我知道的方法可以为每个玩家调用最终游戏例程。我正在尝试使用Game Center匹配器视图控制器和委托方法处理我的应用程序内的回合制匹配。我在阅读实际的Game Center应用程序时看到GKLocalPlayerListener方法适用于匹配(Apple文档没有提到这一点)。如果这是真的,那么GKLocalPlayerListener不是我应用的选项吗?

我可以做些什么来检测比赛何时结束?我希望为每位球员保持双赢记录,因此在比赛结束时为每位球员调用例程非常重要。

2 个答案:

答案 0 :(得分:2)

基于回合制的比赛的生命周期如下所示:

  1. 创建匹配
  2. 邀请他人
  3. 其他人加入
  4. 玩家轮流并传递匹配对象(您的游戏逻辑决定顺序)
  5. 玩家来回发送交换(可选)
  6. 玩家开始离开
  7. ----因为他们被淘汰了
  8. ----因为他们退出了
  9. ----因为他们超时了
  10. 有人胜利
  11. 如果您不是活跃玩家,则在playerReceivedTurnEventForMatch解雇时发生步骤3,4,7,8和9时会通知您;但是,正如你在我的答案中所看到的那样https://stackoverflow.com/a/34458493/1641444 playerReceivedTurnEventForMatch会触发很多不同的条件,并且它不会告诉你哪一个触发了它。您必须根据玩家的状态,哪个玩家是活动玩家以及您在匹配对象中跟踪的其他信息来辨别。

    playerReceivedExchangeRequest解雇(以及回复和取消功能)会通知您#5。

    您的游戏逻辑将决定何时触发#7。我的偏好是匹配对象来到被淘汰的玩家,他们被认为是失败的,并且呼叫participantQuitInTurnWithOutcome

    玩家决定何时通过退出触发#8,代码会根据其状态调用participantQuitInTurnWithOutcomeparticipantQuitOutOfTurnWithOutcome

    条件#9是屁股的真正痛苦。在游戏设计的限制和彻底的错误之间,超时可以创建几个不可恢复的边缘情况。处理超时需要自己完整的答案。

    最后,通过调用endMatchInTurnWithMatchData触发#10。 IOS7中已弃用GKTurnBasedEventHandlerDelegatehandleMatchEnded。使用GKLocalPlayerListner时,您会在另一次出现playerReceivedTurnEventForMatch

    时收到#10的通知

    编辑 - 基于后续问题的澄清:

    是的,确切地说。在您的sendTurn功能中,当游戏结束时,请勿致电endTurnWithNextParticipant。相反,设置每个参与者的状态以指示谁赢了和谁输了,然后拨打endMatchInTurnWithMatchData

    其他玩家将看到playerReceivedTurnEventForMatch火。您可以从比赛状态和游戏结束的玩家状态中辨别出来,并决定对该接收者采取的行动。

答案 1 :(得分:0)

要结束比赛,您应该拨打游戏endMatchInTurnWithMatchData:completionHandler:

如果您在对象上实施了GKTurnBasedEventHandlerDelegate协议,则handleMatchEnded将获得推送活动。

Apple's programming guide

中的更多详情