3

在 iOS 9 中,Apple 弃用public func turnBasedMatchmakerViewController(_ viewController: GKTurnBasedMatchmakerViewController, didFind match: GKTurnBasedMatch) GKTurnBasedMatchmakerViewControllerDelegate.

苹果的方向是func player(_ player: GKPlayer, receivedTurnEventFor match: GKTurnBasedMatch, didBecomeActive: Bool)使用GKLocalPlayerListener.

仅使用receivedTurnEventFor match会导致以下情况:

  1. 用户点击+显示GKTurnBasedMatchmakerViewController.
  2. 用户点击Play Now,Game Center 将搜索匹配项。
  3. Game Center 将返回一个空匹配matchData(新匹配),或者将用户置于一个正在进行的匹配中——并且游戏通过receivedTurnEventFor match.

虽然确定是否已创建新匹配很简单(使用matchData),但似乎没有一种方法可以确定是否已找到匹配与匹配是否在所有事件流过时更新receivedTurnEventFor match

我的问题是这样的:

使用GKLocalPlayerListener'sreceivedTurnEventFor match方法时,有没有办法确定回合事件是否是匹配 find的结果?

4

2 回答 2

2

有四种情况: 1. 你加入了一个新的比赛,轮到你了(你是比赛的创造者) 2. 你加入了一个新的比赛,轮到其他玩家了(你找到了比赛) 3. 你加入了一个现有的比赛并且轮到你了 4。你加入了现有的比赛,轮到其他玩家了。情况 3 和 4 可能是您在比赛之间切换或重新加入比赛时。

您可以检查match.currentPatriticantlastTurnDate属性以确定发生哪种情况。

如果玩家只是创建一个新匹配(receivedTurnEventFor由于匹配而被调用),match.participants[0].lastTurnDate则为 nil 并且match.currentParticipant?.player?.playerID相等GKLocalPlayer.localPlayer().playerID(案例 1)。

如果您加入现有比赛: match.participants[0].lastTurnDatenilmatch.currentParticipant?.player?.playerID不相等GKLocalPlayer.localPlayer().playerID(您加入了新比赛,但其他玩家轮到 - 情况 2)

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

于 2017-02-12T10:59:39.337 回答
0

我认为游戏中心不会在这方面为您提供帮助。receivedTurnEventForMatch它看起来像是对重载函数的又一次模棱两可的调用。但是,我相信你可以自己管理这件事,因为你知道发起玩家总是先看到比赛,然后是其他任何参与者。

看起来这里有四种情况:

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

玩家使用邀请创建新匹配:在这种情况下,所有参与者都应设置在新收到的匹配中。同样,您可以在后续玩家可以读取的比赛数据中设置标志。

玩家加入了作为自动匹配创建的匹配:如果您仅支持 2 名玩家,则在 player2 收到此匹配时,两个 playerID 都将被设置。如果您支持更多,则有可能(不可靠)某些插槽仍将设置为自动匹配,但这不是很有帮助。但是,如果发起玩家在比赛数据中设置了指示哪些玩家被邀请与自动匹配位置的标志,则该玩家可以确定自己的状态。

参加比赛的玩家有一个或多个邀请:与之前的情况相同。加入的玩家无法从游戏中心确定任何有用的信息,并且将依赖原始玩家添加到比赛中的数据。

于 2017-01-10T18:16:26.827 回答