【问题标题】:Game Center Quickmatch: randomly matching opponents (GKTurnBasedMatch)Game Center Quickmatch:随机匹配对手(GKTurnBasedMatch)
【发布时间】:2013-09-08 18:22:03
【问题描述】:

我希望在我的回合制游戏中有一个“快速匹配”模式,让玩家自动与第一个可用的玩家匹配。我正在使用我自己的自定义 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 函数时,我都会继续检索相同的匹配项,每个匹配项只有 1 个有效参与者(本地玩家)。

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

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

【问题讨论】:

    标签: iphone game-center gamekit


    【解决方案1】:

    让我来解决您在此处看到的问题。首先,没有必要将 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 并不总是创建新匹配。如果现有比赛有空位,它将简单地将本地玩家匹配到那个位置。

    编码愉快!
    科尔宾

    【讨论】:

    • 您写道:“这样做的原因是,当与随机(未分配)对手创建比赛时,Game Center 不会分配所有参与者。当轮到他们时分配一个随机参与者。在你的游戏中,直到你第一次轮到你,那场比赛才会出现在云端供其他人玩。”因为当第一个玩家提交回合时,GameCenter 会尝试寻找另一个玩家。为此,第一个玩家必须调用 endTurnWithNextParticipants:turnTimeout:matchData:completionHandler: 方法来提交第一个回合。但是,nextParticipants 数组有 nil,怎么发送轮流呢?
    • 您仍然可以从匹配的参与者数组中添加下一个参与者而不会收到错误消息。这是因为参与者对象本身不是 nil,只有 playerID 属性。在 GameKit 中工作时,您必须始终小心检查参与者的 playerID != nil。我有很多崩溃尝试检查(例如) -isEqual 与 playerID 字符串,由于还没有匹配到的玩家,所以这些字符串为 nil。
    猜你喜欢
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多