我正在制作一个简单的回合制文字游戏,我很难搞清楚邀请函是如何运作的。当用户A邀请用户B参加游戏时,我希望用户B能够在我的自定义匹配界面(即列出所有用户B的游戏的屏幕)中看到该游戏。如果用户B在被邀请参加游戏时点击通知,情况会很好,但如果用户B只是自己导航到应用程序,我仍然希望通过我自己的界面看到游戏。
每当出现此匹配界面屏幕时,我使用[GKTurnBasedMatch loadMatchesWithCompletionHandler:]
来获取所有本地玩家的匹配。有了这个,我会假设用户B能够看到他被邀请参加的比赛,但是这个新的比赛没有出现。如果我通过GKTurnBasedMatchmakerViewController
接受邀请,则用户按预期进入游戏,但更令人费解的是,如果我打开我的GKTurnBasedMatchmakerViewController
然后取消而不接受邀请,那么match现在显示在我的自定义匹配界面中,但它缺少用户A发送的匹配数据。
总而言之,我真的只是想知道如何使用自定义界面正确显示和接受GKTurnBasedMatch
邀请(而不是必须使用GKTurnBasedMatchmakerViewController
)。谢谢!
答案 0 :(得分:1)
这个问题似乎引起了一些人的兴趣,所以这里是我最终做的粗略近似。
首先,新匹配根本没有出现的原因只是我每次想要视图刷新时都没有调用[GKTurnBasedMatch loadMatchesWithCompletionHandler:]
,就像我一样。所以我记得那里没有真正的问题。
真正的问题是我接收并显示新GKTurnBasedMatch
的情况,但没有数据(即对方玩家的第一次移动)可用。从本质上讲,[GKTurnBasedMatch loadMatchesWithCompletionHandler:]
似乎并不能保证为您提供最新的GKTurnBasedMatch
可用对象。为了确保匹配是最新的,我还必须在[match loadMatchDataWithCompletionHandler:]
返回的每个匹配上调用[GKTurnBasedMatch loadMatchesWithCompletionHandler:]
(其中match
是其中一个GKTurnBasedMatches)。这会将与该匹配关联的最新匹配数据作为NSData
对象返回。然后,我可以使用此NSData
来确保我的匹配表中的所有匹配项都已刷新,以反映游戏中心的最新更改。
简而言之,在loadMatchDataWithCompletionHandler
个对象上使用GKTurnBasedMatch
以确保其数据是最新的。
答案 1 :(得分:0)
更新:现在包含接收邀请的实际答案。
我一直在努力以近乎一周的时间以编程方式处理回合制比赛的邀请。我终于找到了答案。我会超级突出它,因为我花了所以很长时间才找到:
Game Center将回合制邀请视为回合事件。
基于回合的事件在GKLocalPlayerListener
协议中的此功能中处理:
player(_ player: GKPlayer, receivedTurnEventFor match: GKTurnBasedMatch,
didBecomeActive: Bool)
当您收到比赛时,请检查您是否被邀请参加比赛并预先确认。您已收到邀请。
<强> BUT:强>
通过令人沮丧的反复试验,我发现了一些警告,希望能为您节省一些时间:
loadMatches
返回的匹配中看到该匹配轮到他们了。显然,游戏中心实际上并不会让任何玩家以任何方式参与比赛的邀请名单 ,直到轮到他们为止。acceptInvite(...)
。因此,如果playerJake检查了由loadMatches
检索到的匹配项,并且能够检测到matchFoo仍然有一个开放的邀请,则playerJake必须调用matchFoo.acceptInvite( /* ...completion handler stuff here... */)
,然后快乐的playerJake关闭并运行。从这里你应该能够让你自己的程序化匹配系统工作。 祝你好运,我的意思是!