2010-10-07 67 views
13

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

现在我得到的是以下内容。我出于显而易见的原因认证本地玩家。然后,我搜索了比赛,像这样:

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来添加更多球员的方法。幸运的是,这种方法存在,但如何工作?在这种情况下,你什么时候打电话?我决定把它放在一个按钮下,这样我就可以在找到匹配的时候手动执行它。

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

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

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

    其实它们被更新。当我看到playerID出现在第二和第三个设备上时,我手动更新设备1上的matchCurrent.playerID,并突然识别出该玩家。但是,即使是在设备1上发现新玩家时,也不会调用播放器的“didChangeState”。

+0

这是基于一个服务器 - 客户端模型或P2P模式? 正在使用什么来初始化一个连接,tcp,udp,http? 当前连接的球员的数据在哪里? – 2010-11-09 13:10:36

+3

“我试图做的是让两个玩家玩一个游戏,如果第三个玩家加入” - 你可以在你的第二句和第三句中加入一些分号和逗号?实际上,在运行句子中,很难判断每个if-子句是修改前一个还是后一个独立的子句。 – LarsH 2010-11-12 19:35:55

回答

0

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

这听起来像你可能想为你正在使用的多玩家框架找到一些更多的文档和/或示例代码。

1

哪个设备应该实际调用 addPlayersToMatch方法?并且 如何将其限制为执行该方法的一台设备 ?

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

2

您使用Apple iOS Game Center 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