嗨,我是iOS游戏中心的新手。我正在尝试使用匹配来添加我的游戏的多人游戏功能并遵循文档。
到目前为止,我已经达到了一个点,我的两个客户端可以成功获得匹配,即调用matchmakerViewController:didFindMatch回调并传递GKMatch对象。
然而在那之后我似乎永远陷在那里,因为根据文档,我将不得不等到所有玩家(在我的情况下为2)实际连接才开始我的游戏。但似乎是匹配:player:didChangeState回调永远不会被调用来表示连接成功。好吧,我确定我的客户都在同一个wifi网络中(或者它是必须的?)任何人都可以在这个案例中启发我吗?我是否必须做任何额外的事情才能让客户连接?非常感谢您的帮助!
答案 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。希望这有帮助!