2010-12-02 68 views
4

嗨,我是iOS游戏中心的新玩家。我正在尝试使用匹配将多人游戏功能添加到我的游戏中并遵循文档。使用GKMatch的游戏中心多人游戏,但似乎无法连接

到目前为止,我达到了我的客户中有2个可以成功获得匹配的点,即matchmakerViewController:didFindMatch回调被调用并且GKMatch对象被传递。

但是在那之后我似乎永远卡在那里,因为根据文档,我必须等到所有玩家(我的情况是2)在开始我的游戏之前实际连接。但它似乎是匹配:播放器:didChangeState回调永远不会被调用来指示成功的连接。那么,我确定我的客户都在同一个无线网络中(或者是必须的?)任何人都可以在这种情况下启发我吗?我是否必须做任何额外的事情才能让客户连接?非常感谢您的帮助!

+1

对这个问题进行了一些更新,我终于做了一次wireshark捕获所有流量,并且我发现Game Center需要使用STUN来克服路由器/ NAT /防火墙,并且通过查看RFC,它说:“当STUN用于获得地址以便与恰好在同一NAT后面的对等方进行通信时,STUN不起作用。”,好吧,我想这可能是我的问题的根源,我的两个客户都在无线路由器的专用网络(192.168.2.x)。但我不确定当我进行测试时,什么是最好的方法来克服这个问题....任何想法? – 2010-12-04 18:40:12

+3

我有和你一样的问题,但我不认为你上面提到的STUN问题是问题所在,因为我使用连接到两个不同的NAT网络的设备进行了测试。 – thomdask 2010-12-05 12:34:31

回答

0

确保您已将您的班级设置为GKSession的代表。该课程将需要实施GKSessionDelegate协议......否则,它将永远不会收到此回调。这是protocol reference。希望这可以帮助!

+0

感谢山姆,但我实际上使用匹配而不是点对点实现多重播放。所以我已经实现并正确设置了GKMatchDelegate协议和GKMatchmakerViewControllerDelegate,但似乎无法接收match:player:didChangeState回调。 – 2010-12-02 17:50:34

2

当你得到GKMatch对象时,一定要检查expectedPlayerCount属性。其他玩家可能已经连接,因此您不会在代表上获得match:player:didChangeState。

+0

相同的代码在相同的NAT中工作,但不在不同的代码中。所以并非如此。 – thomdask 2010-12-13 20:07:46

+0

你检查过房产吗?这完全与时间有关,因此在不同的网络上将表现不同。 – nrp 2011-02-16 21:32:24

1

我和朋友有同样的问题。这个解决方案很奇怪,但之后会起作用。在所有设备上,您必须在设置/通知选项中为游戏中心启用通知(声音/警报/徽章)。之后我们可以建立一个连接,并确实收到一个匹配对象

+0

我不知道这是否适用于我使用ios模拟器进行开发测试。一台运行在我的本机上,另一台运行在os x服务器上的vmware上。通知不包含在ios模拟器中。 – thomdask 2011-01-11 15:16:01

3

所以我遇到了这个问题,解决方案(对我来说)有点让人不好意思。我已经从苹果文档复制并粘贴了一堆代码......并且他们忽略了一个明显的步骤。他们从来没有真正设置比赛的代表!

我的代码现在是:

- (void)matchmakerViewController:(GKMatchmakerViewController *)viewController didFindMatch:(GKMatch *)match { 
[self dismissModalViewControllerAnimated:YES]; 
self.myMatch = match; // Use a retaining property to retain the match. 
self.myMatch.delegate = self; // THIS LINE WAS MISSING IN THE APPLE DOCS. DOH. 
// Start the game using the match. 
NSLog(@"Match started! Expected Player Count:%d %@",match.expectedPlayerCount, match.playerIDs);} 

一旦我实际设置匹配的委托,该函数被调用。卫生署。

1

内回调matchmakerViewController:didFindMatch

添加这个代码,那么你会看到回调 “的比赛:球员:didChangeState”,由GC

被称为
GKMatchRequest *request = [[[GKMatchRequest alloc] init] autorelease]; 
    request.minPlayers = 2; 
    request.maxPlayers = 2; 
    [[GKMatchmaker sharedMatchmaker] addPlayersToMatch:match matchRequest:request completionHandler:^(NSError* error) { 
     if(error) 
      NSLog(@"Error adding player: %@", [error localizedDescription]); 
    }]; 
1

这都是一起工作。唯一的区别是,当你使用邀请事件“didChangeState”时,不会被调用。您无需通知即可连接,并且您可以开始接收数据。我从来没有尝试发送/接收数据......因为我期待着事件的第一次,但我确实发送了一次错误,它的工作。 :)

- (void)matchmakerViewController:(GKMatchmakerViewController *)viewController didFindMatch:(GKMatch *) match {  
    //Dismiss window 
    [self dismissModalViewControllerAnimated:YES]; 

    //Retain match 
    self.myMatch = match; 

    //Delegate 
    myMatch.delegate = self; 


    //Flag 
    matchStarted = TRUE; 

    //Other stuff 
} 

- (void)match:(GKMatch *)match player:(NSString *)playerID didChangeState:(GKPlayerConnectionState)state { 
    //This code gets called only on auto-match 
} 

上述代码按预期工作。