如何检测 Game Center 回合制比赛何时在 iOS9 结束?

How to detect when Game Center turn based match has ended in iOS9?

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

如何检测比赛何时结束?我想为每个玩家保留一个输赢记录,所以在比赛结束时为每个玩家调用一个例程很重要。

要结束比赛,您应该进行游戏通话 endMatchInTurnWithMatchData:completionHandler:

如果您在对象上实施了 GKTurnBasedEventHandlerDelegate 协议,您的 handleMatchEnded 将获得一个推送事件。

Apple's programming guide

中有更多详细信息

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

  1. 创建匹配项
  2. 邀请其他人
  3. 其他人加入
  4. 玩家轮流传递比赛对象(您的游戏逻辑决定顺序)
  5. 玩家来回发送交流(可选)
  6. 玩家开始离开
  7. ----因为被淘汰了
  8. ----因为他们退出了
  9. ----因为超时了
  10. 有人赢了

如果您不是活跃玩家,当第 3、4、7、8 和 9 步发生 playerReceivedTurnEventForMatch 射击时,您会收到通知;但是,正如您从我在这里的回答中看到的那样, playerReceivedTurnEventForMatch 会在许多不同的条件下触发,并且它不会告诉您是哪一个触发了它。您必须根据玩家的状态、哪个玩家是活跃玩家以及您在匹配对象中跟踪的任何其他信息来辨别。

playerReceivedExchangeRequest 触发(以及回复和取消功能)通知您#5。

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

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

条件 #9 真是令人头疼。在游戏设计的局限性和彻底的错误之间,超时会产生几个不可恢复的边缘情况。处理超时需要自己的完整答案。

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

通知 #10

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

是的,没错。在您的 sendTurn 函数中,当游戏结束时,不要调用 endTurnWithNextParticipant。相反,设置每个参与者的状态以指示谁赢了谁输了,然后调用 endMatchInTurnWithMatchData.

其他玩家会看到 playerReceivedTurnEventForMatch 开火。您可以从比赛状态和玩家状态判断游戏结束,并决定对该接收者采取什么行动。