首页 文章

Game Center Quickmatch:随机匹配对手(GKTurnBasedMatch)

提问于
浏览
4

我希望在我的回合制游戏中有一个“快速匹配”模式,玩家可以自动匹配第一个可用的玩家 . 我正在使用自己的自定义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 ) .

thought 如果我在另一个实例上运行相同的代码,使用不同的游戏中心ID,那么这两个用户将相互匹配......但这似乎不正确 . 每当我调用 GKTurnBasedMatch loadMatchesWithCompletionHandler 函数时,我会继续检索相同的匹配项,每个匹配项只有一个有效参与者(本地播放器) .

这个问题似乎与iOS Development: How do I auto match players in Game Center?类似,它确实表明设置 request.playersToInvite = nil; 应该完成自动匹配,但这似乎对我没有用 .

如何让Game Center自动匹配这些玩家?

1 回答

  • 7

    让我来解决你在这里看到的问题 . 首先,没有必要将playersToInvite属性设置为nil,因为这是默认状态,除非玩家被分配给它,但这不会导致你的“问题” . 我把它放在引号中,因为你实际上正确地编写了代码,并且只能感知到不存在的问题 . 让我带您了解findMatchForeRequest完成后会发生什么 .

    当调用完成块时,Game Center创建了一个新的GKTurnBasedMatch对象,其中有两个参与者,第一个是本地玩家(你),第二个实际上是一个空参与者,玩家ID为零 . 这样做的原因是,当与随机(未分配)对手创建匹配时,Game Center不会分配所有参与者 . 在向他们发送转弯时分配随机参与者 . 在你的游戏中,这个匹配不会出现在 Cloud 端,供其他人玩,直到你第一次转弯 .

    现在,在您的其他设备/游戏中心ID上调用loadMatchesWithCompletionHandler将不会自动显示匹配,除非您特别邀请该玩家使用playerToInvite(并且已按照上面的指定轮到您) . 想想这样:如果它以这种方式工作,世界上的每个玩家在调用loadMatchesWithCompletionHandler时都会看到存在的每个自动匹配 .

    另一个游戏中心ID实际上必须调用findMatchForRequest而不设置playerToInvite属性,以便匹配您的其他ID创建的游戏中可用的空座位 . 这样就可以保留创建匹配时“它总是轮到你”的范例,但该播放器现在位于第二个插槽中,而不是第一个插槽 . 只需在第二个ID上创建游戏,就像在第一个ID上完全相同,你的游戏将由两个参与者创建,第一个来自最初创建它的ID,第二个是加入匹配的ID通过调用findMatchForRequest . 这里的关键是如果playersToInvite为零,则findMatchForRequest不会始终创建新的匹配 . 如果存在与开放座位的现有匹配,则它将简单地将本地玩家与该匹配 .

    快乐的编码!
    科尔宾

相关问题