0

Game Center 的回合制匹配界面允许用户创建与多个玩家的匹配,并在其中一些位置邀请好友,而让其他位置进行自动匹配。

我正在创建我们自己的游戏内匹配创建界面,到目前为止,它运行良好,除了创建与受邀玩家和自动匹配玩家的匹配。

GKMatchmaker 具有 addPlayersToMatch 方法,我相信您可以在匹配存在后添加自动匹配玩家,但 GKTurnBasedMatch 没有等效方法。

以下是我正在使用的代码,它工作得很好。如果有人知道如何添加许多自动匹配玩家,将不胜感激!

- (GKMatchRequest *) buildMatchRequestWithFriends: (NSArray *) friendsList NumberOfPlayers: (NSInteger) numberOfPlayers
{
    NSLog(@"TurnByTurnHelper.buildMatchRequestWithFriends");
    GKMatchRequest *request = [[GKMatchRequest alloc] init];
    NSArray *playersToInvite = [NSArray arrayWithArray:friendsList];
    request.playersToInvite = playersToInvite;
    request.defaultNumberOfPlayers = numberOfPlayers + 1;
    return request;
}

- (void) requestMatchWithFriends:(NSArray *) friendsList NumberOfPlayers: (NSInteger) numberOfPlayers{

    if (!_delegate)
    {
        NSLog(@"Error: Expected but did not find delegate");
        return;
    }

    GKMatchRequest *request = [self buildMatchRequestWithFriends:friendsList NumberOfPlayers: numberOfPlayers];

    [GKTurnBasedMatch findMatchForRequest: request withCompletionHandler:^(GKTurnBasedMatch *match, NSError *error)
     {
         if (match){
             NSLog(@"findMatchForRequest: Success!");

             // Add match to matches

         } else {
             NSLog(@"error: %@", error);

         }
     }];
}
4

1 回答 1

0

好吧,经过一番搜索和测试,我发现 Apple Developer 文档不完整和/或具有误导性。在 GKMatchRequest 的 playerToInvite 属性部分做了以下声明:

“如果该属性的值为非零,则当您使用请求创建比赛时,Game Center 会邀请这些玩家参加比赛。不会进行任何自动操作,并且 GKMatchRequest 的 maxPlayers 和 minPlayers 属性将被忽略。”

这对于 GKMatchmaker 是正确的,但对于 GKTurnBasedMatch 不是!对于 GKTurnBasedMatch,如果您在 playerToInvite 属性中提供一组 playerId,则不会忽略 maxPlayers 和 minPlayers 属性,并且 Game Center 会用随机玩家填充额外的空间。

以下代码可以解决问题:

- (GKMatchRequest *) buildMatchRequestWithFriends: (NSArray *) friendsList NumberOfPlayers: (NSInteger) numberOfPlayers
{
    GKMatchRequest *request = [[GKMatchRequest alloc] init];
    NSArray *playersToInvite = [NSArray arrayWithArray:friendsList];

    if([friendsList count]<=0){
        request.minPlayers = 2;
        request.maxPlayers = numberOfPlayers;
        request.playersToInvite = nil;
    } else {
        request.minPlayers = 2;
        request.maxPlayers = numberOfPlayers;
        request.playersToInvite = playersToInvite;
    }

    return request;
}

这个故事的寓意是:有时最好不要使用 RTFM!

于 2014-04-14T23:32:09.307 回答