2

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

我可以做些什么来检测比赛何时结束?我想为每个球员保持一个输赢记录,所以在比赛结束时为每个球员调用一个例程很重要。

4

2 回答 2

3

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

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

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

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

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

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

条件#9是一个真正的痛苦。在游戏设计的限制和彻底的错误之间,超时可能会产生几个不可恢复的边缘情况。处理超时保证自己的完整答案。

最后,#10 由调用触发endMatchInTurnWithMatchDataGKTurnBasedEventHandlerDelegatehandleMatchEnded在 IOS7 中被弃用。使用 时GKLocalPlayerListner,您将再次出现 #10 通知playerReceivedTurnEventForMatch

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

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

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

于 2016-03-26T03:01:48.177 回答
0

要结束一场比赛,你应该有你的游戏电话endMatchInTurnWithMatchData:completionHandler:

如果你GKTurnBasedEventHandlerDelegate在一个对象上实现了协议,你handleMatchEnded会得到一个推送事件。

Apple 编程指南中的更多详细信息

于 2016-03-25T21:14:33.887 回答