我只是无法弄清楚这是如何工作的 . 我想要做的是让两个玩家玩游戏,如果第三个玩家加入它可以立即加入游戏,如果第四个和最后一个玩家加入它也可以立即加入游戏 . 他们也可以随时出于任何原因离开游戏,如果发生这种情况,应该为另一个人或同一个人重新连接打开一个空间 . 这就是主意 .
现在我得到的是以下内容 . 我出于显而易见的原因验证了本地播放器 . 然后我像这样搜索一个匹配:
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来添加更多玩家 . Luckely这种方法存在,但是如何运作呢?在这种情况下你什么时候打电话?我决定将它放在一个按钮下,这样我就可以在找到匹配项时手动执行它 .
我发现当我在第一个设备上按下它时,最后第三个设备可以找到第一个和第二个设备所在的匹配 . 事实上,第二个和第三个设备包含所涉及的每个设备的playerID . 这是件好事 . 但是有两个问题 .
-
哪个设备实际上应该调用addPlayersToMatch方法?如何将它限制为执行该方法的一个设备?再加上什么时候打电话给它?
-
为什么在调用该方法的设备上,不是更新了playerID?
[[GKMatchmaker sharedMatchmaker] addPlayersToMatch:matchCurrent matchRequest:matchRequest completionHandler:^(NSError *error) {
//matchCurrent.playerIDs is not updated?!
}];
实际上他们已经更新了 . 当我看到第二个和第三个设备上出现播放器ID时,我手动更新设备1上的matchCurrent.playerIDs,突然它确实识别出播放器 . 然而,当在设备1上发现新玩家时,甚至不会调用玩家的'didChangeState' .
3 回答
您可以通过让设备“吸管”来解决这个问题 . 每个设备生成一个随机数,然后将其发送给其他设备 . 具有最大编号的设备是领导者,并且它必须调用addPlayersToMatch . 如果两个设备选择相同的号码,请丢弃数字并重新开始 .
我建议您定期(可能每秒或每两次)对其他玩家的状态进行投票,这样您就可以检测是否有人因任何原因加入或离开 . 除非您使用的iphone架构已经提供了处理该事件的功能 .
听起来您可能想要为您正在使用的多人游戏框架找到更多文档和/或示例代码 .
您使用Apple iOS游戏中心GKMatchmaker类 . 我假设您使用的是点对点连接,而不是托管 .
GKMatch类为您提供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