Создание GKTurnBasedMatch с участием приглашенных и автоматически подобранных игроков

Интерфейс пошагового подбора игроков 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);

         }
     }];
}

person Chris Nelson    schedule 14.04.2014    source источник


Ответы (1)


Что ж, после небольшого поиска и тестирования я обнаружил, что документация Apple Developer неполна и/или вводит в заблуждение. В разделе свойств playerToInvite запроса GKMatchRequest делается следующее утверждение:

«Если значение свойства не равно нулю, когда вы используете запрос для создания матча, Game Center приглашает этих игроков на матч. Автоматизация не выполняется, а свойства GKMatchRequest maxPlayers и minPlayers игнорируются».

Это верно для GKMatchmaker, но НЕ для GKTurnBasedMatch! Для GKTurnBasedMatch, если вы предоставляете массив идентификаторов игроков в свойстве playerToInvite, свойства 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!

person Chris Nelson    schedule 14.04.2014
comment
Сейчас я балуюсь с GameCenter, и этот комментарий только что сэкономил мне часы работы, я думаю. Геймцентр такой странный. - person Negora; 14.05.2020