5

我正在开发一个简单的回合制文字游戏,但我很难弄清楚邀请是如何工作的。当用户 A 邀请用户 B 参加游戏时,我希望用户 B 能够在我的自定义匹配界面(即列出用户 B 的所有游戏的屏幕)中看到该游戏。如果用户 B 在被邀请参加游戏时单击通知,一切都很好,但如果用户 B 只是自己导航到应用程序,我仍然希望游戏通过我自己的界面可见。

每当出现此比赛界面屏幕时,我都会使用[GKTurnBasedMatch loadMatchesWithCompletionHandler:]它来获取本地玩家的所有比赛。有了这个,我假设用户 B 可以看到他被邀请参加的比赛,但是这个新的比赛没有出现。如果我通过 接受邀请GKTurnBasedMatchmakerViewController,则用户按预期进入游戏,但更令人费解的是,如果我打开我的GKTurnBasedMatchmakerViewController然后取消而不接受邀请,现在我的自定义匹配界面中会出现一个新的匹配,但它缺少用户 A 发送的匹配数据。

总而言之,我真的只是想知道如何GKTurnBasedMatch使用自定义界面(而不是必须使用GKTurnBasedMatchmakerViewController)正确显示和接受邀请。谢谢!

4

2 回答 2

1

这个问题似乎有几个人感兴趣,所以这里是我最终做的一个粗略的近似。

首先,新比赛根本没有出现的原因只是我没有[GKTurnBasedMatch loadMatchesWithCompletionHandler:]像我想的那样每次都想刷新视图时打电话。所以我记得没有真正的问题。

真正的问题是我收到并显示新的GKTurnBasedMatch,但没有任何数据(即对方玩家的第一步)可用。从本质上讲,[GKTurnBasedMatch loadMatchesWithCompletionHandler:]似乎不能保证为您提供最新的GKTurnBasedMatch可用对象。为了确保匹配是最新的,我还必须[match loadMatchDataWithCompletionHandler:]在返回的每个匹配上调用 , [GKTurnBasedMatch loadMatchesWithCompletionHandler:](其中match一个是 GKTurnBasedMatches)。这会将与该匹配关联的最新匹配数据作为NSData对象返回。然后我可以使用它NSData来确保我的比赛表中的所有比赛都被刷新,以反映游戏中心的最新变化。

简而言之,loadMatchDataWithCompletionHandler在您的GKTurnBasedMatch对象上使用以确保它们的数据是最新的。

于 2013-04-02T18:16:05.977 回答
0

更新:现在包括接收邀请的实际答案。

近一周来,我一直在努力以编程方式处理回合制比赛的邀请。我终于找到了答案。我要特别强调它,因为我花了长时间才找到:

Game Center 将回合制邀请视为回合事件。它们的处理方式与其他邀请不同。

基于回合的事件在协议中的此函数中处理GKLocalPlayerListener

player(_ player: GKPlayer, receivedTurnEventFor match: GKTurnBasedMatch, 
       didBecomeActive: Bool)

当您收到比赛时,请检查您是否被邀请参加比赛,然后立即进行。您已收到邀请。

但:

通过令人沮丧的反复试验,我发现了一些注意事项,希望可以为您节省一些宝贵的时间:

  1. 它只是简单并不总是有效。信不信由你,Game Center 是不可靠的。这意味着您需要一个备份系统来查看本地球员的公开比赛并搜索他们以寻找新的邀请。这本身与警告#2有关。
  2. 被邀请参加比赛的玩家(例如,playerJake 被邀请参加 matchFoo)实际上不会收到该邀请,也不会在轮到他们返回的比赛中看到该比赛。loadMatches显然,在轮到他们之前,Game Center 实际上不会以任何方式让任何玩家参与比赛的邀请名单。
  3. 如果您可以确定您被邀请参加但尚未回复的比赛,则必须acceptInvite(...) 直接致电该比赛。因此,如果 playerJake 检查了由 检索到的匹配loadMatches项,并且能够检测到 matchFoo 仍然有一个开放的邀请,则 playerJake 必须调用matchFoo.acceptInvite( /* ...completion handler stuff here... */),然后快乐的 playerJake 关闭并运行。

从这里你应该能够让你自己的程序匹配系统工作。祝你好运,我是认真的!

于 2017-03-07T20:19:25.543 回答