游戏中心以编程方式查找匹配项

Mar*_*ark 13 iphone center match

我只是无法弄清楚这是如何工作的.我想要做的是让两个玩家玩游戏,如果第三个玩家加入它可以立即加入游戏,如果第四个和最后一个玩家加入它也可以立即加入游戏.他们也可以随时出于任何原因离开游戏,如果发生这种情况,应该为另一个人或同一个人重新连接打开一个空间.这就是主意.

现在我得到的是以下内容.我出于显而易见的原因验证了本地播放器.然后我像这样搜索一个匹配:

if (matchRequest) [matchRequest release];
matchRequest            = [[GKMatchRequest alloc] init];
matchRequest.minPlayers = 2;
matchRequest.maxPlayers = 4;

[[GKMatchmaker sharedMatchmaker] findMatchForRequest:matchRequest withCompletionHandler:^(GKMatch *match, NSError *error) {
    if (error) {
        // An error occured
    } else {
        if (matchCurrent) [matchCurrent release];
        matchCurrent          = [match retain];
        matchCurrent.delegate = self;
    }
}];
Run Code Online (Sandbox Code Playgroud)

如果我在三个不同的设备上执行这个部分,其中两个会找到对方,第三个仍在寻找.所以我想在找到匹配请求之后找到了它将被执行一次的最小数量的玩家.所以我需要的是一种方法,它使用我保留的matchCurrent来添加更多玩家.Luckely这种方法存在,但是如何运作呢?在这种情况下你什么时候打电话?我决定将它放在一个按钮下,这样我就可以在找到匹配项时手动执行它.

我发现当我在第一个设备上按下它时,最后第三个设备可以找到第一个和第二个设备所在的匹配.事实上,第二个和第三个设备包含所涉及的每个设备的playerID.这是件好事.但是有两个问题.

  1. 哪个设备实际上应该调用addPlayersToMatch方法?如何将它限制为执行该方法的一个设备?再加上什么时候打电话给它?
  2. 为什么,在调用该方法的设备上,不是更新了playerID?

    [[GKMatchmaker sharedMatchmaker] addPlayersToMatch:matchCurrent matchRequest:matchRequest completionHandler:^(NSError *error) {
        //matchCurrent.playerIDs is not updated?!
    }]; 
    
    Run Code Online (Sandbox Code Playgroud)

    实际上他们已经更新了.当我看到第二个和第三个设备上出现播放器ID时,我手动更新设备1上的matchCurrent.playerIDs,突然它确实识别出播放器.然而,当在设备1上发现新玩家时,甚至不会调用玩家的'didChangeState'.

Dro*_*onz 0

我建议您定期(也许每秒一次或两次)轮询其他玩家的状态,以便您可以检测是否有人加入或因任何原因离开。除非您使用的 iPhone 架构已经提供了处理该事件的函数。

听起来您可能想为您正在使用的多人游戏框架找到更多文档和/或示例代码。