我希望在我的回合制游戏中有一个“快速匹配”模式,玩家可以自动匹配第一个可用的玩家。我正在使用自己的自定义UI。到目前为止我的代码看起来像这样:
- (void)quickMatch {
GKMatchRequest *request = [[GKMatchRequest alloc] init];
request.minPlayers = 2;
request.maxPlayers = 2;
request.playersToInvite = nil;
[GKTurnBasedMatch findMatchForRequest:request withCompletionHandler:^(GKTurnBasedMatch *match, NSError *error) {
NSLog(@"MATCH: %@ %@ %@ %d",error,match,match.matchID,(int)match.status);
}];
这已成功创建匹配项,但匹配中的第二位参与者具有null
ID(playerID:(null) status:Matching
)。
我想如果我在另一个实例上使用不同的Game Center ID运行相同的代码,那么这两个用户将相互匹配......但这似乎不是正确。每当我调用GKTurnBasedMatch loadMatchesWithCompletionHandler
函数时,我会继续检索相同的匹配,每个匹配只有一个有效参与者(本地播放器)。
此问题似乎与iOS Development: How do I auto match players in Game Center?类似,它确实表明设置request.playersToInvite = nil;
应该完成自动匹配,但这似乎对我没用。
如何让Game Center自动将这些玩家相互匹配?
答案 0 :(得分:7)
让我谈谈你在这里看到的问题。首先,没有必要将playersToInvite属性设置为nil,因为这是默认状态,除非玩家被分配给它,但这不会导致你的“问题”。我把它放在引号中,因为你实际上正确地编写了代码,并且只能感知到不存在的问题。让我带您了解findMatchForeRequest完成后会发生什么。
当调用完成块时,Game Center创建了一个新的GKTurnBasedMatch对象,其中有两个参与者,第一个是本地玩家(你),第二个实际上是一个空参与者,玩家ID为nil。这样做的原因是,当与随机(未分配)对手创建匹配时,Game Center不会分配所有参与者。在向他们发送转弯时分配随机参与者。在你的游戏中,这个匹配不会出现在云端,供其他人玩,直到你第一次转弯。
现在,在您的其他设备/游戏中心ID上调用loadMatchesWithCompletionHandler将不会自动显示匹配,除非您特别邀请该玩家使用playerToInvite(并且已按照上面的说明轮流)。想想这样:如果它以这种方式工作,世界上的每个玩家在调用loadMatchesWithCompletionHandler时都会看到存在的每个自动匹配。
另一个游戏中心ID实际上必须调用findMatchForRequest而不设置playerToInvite属性,以便匹配您的其他ID创建的游戏中可用的空座位。这样就可以保留创建匹配时“它总是轮到你”的范例,但该播放器现在位于第二个插槽中,而不是第一个插槽。只需在第二个ID上创建游戏,就像在第一个ID上完全相同,你的游戏将由两个参与者创建,第一个来自最初创建它的ID,第二个是加入匹配的ID通过调用findMatchForRequest。这里的关键是如果playersToInvite为零,则findMatchForRequest不会始终创建新的匹配。如果存在与开放座位的现有匹配,则它将简单地将本地玩家与该匹配。
快乐编码!
卡宾