5

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

这成功创建了匹配,但匹配中的第二个参与者有一个nullID ( playerID:(null) status:Matching)。

认为如果我在另一个实例上运行相同的代码,使用不同的 Game Center ID,那么这两个用户将相互匹配......但这似乎不正确。每当我调用该GKTurnBasedMatch loadMatchesWithCompletionHandler函数时,我都会继续检索相同的匹配项,每个匹配项只有 1 个有效参与者(本地玩家)。

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

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

4

1 回答 1

8

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

当调用完成块时,Game Center 已经创建了一个新的 GKTurnBasedMatch 对象,其中有两个参与者,第一个是本地玩家(你),第二个实际上是一个空的参与者,playerID 为零。这样做的原因是,当与随机(未分配)对手创建比赛时,Game Center 不会分配所有参与者。当轮到他们时,随机分配一个参与者。在您的游戏中,该比赛不会显示在云中供其他人参加,直到您第一次轮到您。

现在,在您的其他设备/Game Center ID 上调用 loadMatchesWithCompletionHandler 将不会自动显示比赛,除非您通过 playerToInvite 专门邀请了该玩家(并且已经按照上面的说明轮到您了)。可以这样想:如果它以这种方式工作,那么世界上的每个玩家都会在调用 loadMatchesWithCompletionHandler 时看到存在的每个自动匹配。

另一个 Game Center ID 必须实际调用 findMatchForRequest 且未设置任何 playerToInvite 属性,才能匹配到您的另一个 ID 创建的游戏中可用的空座位。这样,创建比赛时“总是轮到你”的范式得以保留,但该玩家现在位于第二个位置,而不是第一个位置。只需以与第一个 ID 完全相同的方式在第二个 ID 上创建游戏,您的游戏将由两个参与者创建,第一个来自最初创建它的 ID,第二个来自加入比赛的 ID通过调用 findMatchForRequest。这里的关键是如果 playerToInvite 为 nil,findMatchForRequest 并不总是创建新匹配。如果现有比赛有空位,它将简单地将本地玩家匹配到该比赛中。

快乐编码!
科尔宾

于 2013-11-04T00:57:40.670 回答