Game Center Multiplayer使用GKMatch但似乎无法连接

时间:2010-12-02 16:45:03

标签: iphone objective-c game-center

嗨,我是iOS游戏中心的新手。我正在尝试使用匹配来添加我的游戏的多人游戏功能并遵循文档。

到目前为止,我已经达到了一个点,我的两个客户端可以成功获得匹配,即调用matchmakerViewController:didFindMatch回调并传递GKMatch对象。

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

6 个答案:

答案 0 :(得分:3)

所以我遇到了这个并且解决方案(对我而言)有点令人尴尬。我复制并粘贴了Apple docs中的一堆代码......他们遗漏了一个显而易见的步骤。他们从未真正设置过比赛的代表!

我的代码现在是:

- (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 :(得分:2)

获取GKMatch对象时,请务必检查expectedPlayerCount属性。另一个玩家可能已经连接,因此你不会在代表上获得匹配:player:didChangeState。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

在你的回调matchmakerViewController里面:didFindMatch

添加此代码,然后您将看到GC调用回调“match:player:didChangeState”

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

答案 4 :(得分: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
}

上面的代码按预期工作。

答案 5 :(得分:0)

确保您已将班级设为GKSession的代理人。该类需要实现GKSessionDelegate协议...否则,它将永远不会收到此回调。这是protocol reference。希望这有帮助!