当使用GKLocalPlayerListener的receivedTurnEventFor匹配时,有没有办法确定转弯事件是否是匹配发现的结果?

时间:2016-12-31 03:58:34

标签: ios swift gamekit gkturnbasedmatch

在iOS 9中,Apple弃用了public func turnBasedMatchmakerViewController(_ viewController: GKTurnBasedMatchmakerViewController, didFind match: GKTurnBasedMatch) 的{​​{1}}方法。

Apple的方向是使用GKTurnBasedMatchmakerViewControllerDelegate的{​​{1}}方法。

仅使用func player(_ player: GKPlayer, receivedTurnEventFor match: GKTurnBasedMatch, didBecomeActive: Bool)会导致以下情况:

  1. 用户点按GKLocalPlayerListener,显示receivedTurnEventFor match
  2. 用户点击+,游戏中心将搜索匹配项。
  3. Game Center将返回一个空GKTurnBasedMatchmakerViewController的匹配(新匹配),或将用户置于正在进行的匹配中 - 并通过Play Now通知游戏。
  4. 虽然确定是否已创建新匹配(使用matchData)非常简单,但似乎没有办法确定是否找到匹配,而是将匹配更新为全部事件流经receivedTurnEventFor match

    我的问题是:

    使用matchData的{​​{1}}方法时,有没有办法确定转弯事件是否是匹配发现的结果?

2 个答案:

答案 0 :(得分:1)

有四种情况: 你参加了一场新的比赛,轮到你了(你是比赛的创造者) 你参加了一场新比赛,其他球员转身(你找到了比赛) 你参加了一场精彩的比赛,轮到你了 你参加现有的比赛,然后是其他球员。 情况3和4可能是您在比赛之间切换或重新加入比赛。

您可以查看match.currentPatriticantlastTurnDate属性,以确定发生的情况。

如果玩家只是创建新匹配(receivedTurnEventFor因匹配而被调用)match.participants[0].lastTurnDate为零且match.currentParticipant?.player?.playerID等于GKLocalPlayer.localPlayer().playerID(案例1)

如果您加入现有比赛: match.participants[0].lastTurnDatenilmatch.currentParticipant?.player?.playerID不等于GKLocalPlayer.localPlayer().playerID(您加入了新的匹配,但其他玩家处于转弯状态2)

明确确定案例3和案例4,您可以查看所有参与者的lastTurnDate,并将本地玩家与当前玩家进行比较。

答案 1 :(得分:0)

我认为游戏中心不会帮助你。它看起来像是对重载receivedTurnEventForMatch函数的另一个模糊调用。但是,我相信你可以自己管理这个,因为你知道发起的玩家总是在任何其他参与者之前看到比赛。

这里看起来有四种情况:

玩家与至少一个自动匹配参与者创建一个新匹配:您可以检测到这一点,因为参与者将在"匹配"收到新比赛时的状态。在这种情况下,作为创建者,您可以在匹配数据中设置标志,指​​示哪些玩家有邀请,哪些是自动匹配。

玩家通过邀请创建新匹配:在这种情况下,应在新接收的匹配中设置所有参与者。同样,您可以在后续玩家可以阅读的匹配数据中设置标记。

玩家加入一个作为自动匹配创建的匹配:如果你只支持2个玩家,那么当player2收到这个匹配时,两个玩家ID都将被设置。如果你支持更多,那么某些插槽仍将被设置为自动匹配(不可靠),但这并不是很有帮助。但是,如果原始播放器在匹配数据中设置标记,指示哪些玩家被邀请与自动匹配插槽,则该玩家可以确定自己的状态。

玩家加入一场比赛有一个或多个邀请:与之前的情况相同。加入的玩家不能从游戏中心确定任何有用的东西,并且将依赖于由发起玩家添加到匹配的数据。