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


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

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

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;
    }
}];

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

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

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

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

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


13
2017-10-07 20:02


起源


这是基于服务器 - 客户端模型还是p2p模型?什么用于初始化连接,tcp,udp,http?为当前连接的玩家保存的数据在哪里? - Tom 'Blue' Piddock
“我想做的是让第二个玩家加入时让两个玩家玩游戏” - 你能在你的第二和第三句话中添加一些分号和逗号吗?实际上,在连续句中,很难判断每个if子句是否修改了前一个或后一个独立子句。 - LarsH


答案:


您使用Apple iOS游戏中心GKMatchmaker类。我假设您使用的是点对点连接,而不是托管。

GKMatch类为您提供playerIDs数组。

@property(nonatomic, readonly) NSArray *playerIDs

这是一个有序列表,因此您可以使用它来选择第一个玩家调用addPlayersToMatch。

下面链接的是一些文档。

http://developer.apple.com/library/ios/#documentation/GameKit/Reference/GKMatchmaker_Ref/Reference/Reference.html

http://developer.apple.com/library/ios/#documentation/GameKit/Reference/GKMatch_Ref/Reference/Reference.html

http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/GameKit_Guide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40008304


2
2017-11-17 19:19





哪个设备应该实际调用   addPlayersToMatch方法?怎么可以   你将它限制在一个设备上   执行那个方法?

您可以通过让设备“吸管”来解决这个问题。每个设备生成一个随机数,然后将其发送给其他设备。编号最大的设备是领导者,它必须调用addPlayersToMatch。如果两个设备选择相同的号码,请丢弃这些号码并重新开始。


1
2017-11-14 20:22





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

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


0
2017-11-14 00:58