【问题标题】:Game Center Finding a Match ProgrammaticallyGame Center 以编程方式查找比赛
【发布时间】:2011-04-22 13:49:17
【问题描述】:

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

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

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 来添加更多玩家的方法。幸运的是,这种方法存在,但它是如何工作的呢?在这种情况下你什么时候调用它?我决定将它放在一个按钮下,以便在找到匹配项时手动执行它。

我发现,当我在第一台设备上按下它时,第三台设备终于可以找到第一台和第二台设备所在的匹配项。事实上,第二台和第三台设备包含了每个相关设备的播放器ID。这是一件好事。但是有两个问题。

  1. 哪个设备实际上应该调用 addPlayersToMatch 方法?以及如何将其限制为执行该方法的一个设备?另外,您应该什么时候调用它?
  2. 为什么在调用该方法的设备上,playerID 没有更新?

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

    实际上它们已更新。当我看到 playerIDs 出现在第二台和第三台设备上时,我手动更新了设备 1 上的 matchCurrent.playerIDs 并且突然它确实识别了播放器。但是,当在设备一上发现新播放器时,甚至不会调用播放器的“didChangeState”。

【问题讨论】:

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

标签: iphone center match


【解决方案1】:

您正在使用 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】:

    哪个设备实际上应该调用 addPlayersToMatch 方法?又怎么能 您将其限制在一台设备上 执行那个方法?

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        我正在通过 Prime31's GameCenterMultiplayerBinding 使用 Unity 执行此操作。我不完全确定它是如何映射到 GameKit 的(文档很少,也没有提供这些细节),但名称很有启发性。

        为了能够将 2 到 4 名玩家匹配到一场比赛中,我正在这样做:

        findMatchProgrammaticallyWithFilters(
                                minPlayers: 2,
                                maxPlayers: 4,
                                playerGroup: GetCurrentPlayerGroup(),
                                playerAttributes: 0);
        

        我假设这映射到 findMatchForRequest:withCompletionHandler

        成功之后,我调用:

        finishMatchmakingForMatch();
        

        这肯定映射到finishMatchmakingForMatch。我发现如果我没有先调用 finishMatchmakingForMatch,调用 findMatchForRequest 或 addPlayersToMatch 会失败并显示“请求的操作已被用户取消或禁用”。

        addPlayersToCurrentMatchWithUpdatedMatchRequest(
                                minPlayers: 2,
                                maxPlayers: 4,
                                playerGroup: GetCurrentPlayerGroup(),
                                playerAttributes: 0,
                                playersToInvite: null);
        

        addPlayersToMatch:matchRequest:completionHandler

        成功之后,我调用:

        finishMatchmakingForMatch();
        

        如果我有更多玩家的空间,我会循环并再次致电addPlayersToMatch

        我希望如此,因为我完成后需要致电 finishMatchmakingForMatch 对接会,解雇findMatchProgrammatically 会一直寻找直到它 找到了maxPlayers,但没有。它在第一场比赛后放弃。所以我们需要 拨打addPlayersToMatch

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-23
          • 1970-01-01
          • 2011-04-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多