Не удается добавить дополнительных игроков с помощью [GKMatchmaker addPlayersToMatch] на iPhone/IOS 5

У меня есть приложение Game Center. Я успешно соединяю двух клиентов и могу отправлять сообщения и т. Д. Сейчас я пытаюсь добавить 3-го /4-го клиента с [GKMatchmaker addPlayersToMatch] вот так...

- (void) findAdditionalPlayer
{
    GKMatchRequest *request = [[[GKMatchRequest alloc] init] autorelease];
    request.minPlayers = 2;  // minPlayers = 3 doesn't work either
    request.maxPlayers = 4;

    [[GKMatchmaker sharedMatchmaker] addPlayersToMatch:match matchRequest:request completionHandler:^(NSError *error)
    {
        if (error)
        {
            // Process the error.
            NSLog(@"Could not find additional player - %@", [error localizedDescription]);
        }
        else
        {
            NSLog(@"Find additional player expecting = %d", match.expectedPlayerCount);
        }
    }];
}

Если один клиент (проверенный сервер) звонит findAdditionalPlayer Я никогда не подключаюсь (другой клиент использует GKMatchmakerViewController). Странно, если оба подключенных клиента звонят findAddtionalPlayer, тогда мой блок завершения выполняется (the match.expectedPlayerCount == 2), но мой третий клиент никогда не подключается.

Должен ли только один игровой клиент вызывать эту функцию выше? Документация на самом деле не указывает.

У кого-нибудь есть пример использования addPlayersToMatch это работает?

1 ответ

По моему опыту, для игры с двумя игроками оба игрока должны выполнить addPlayersToMatch, чтобы они снова подключились к игре (и общались назад и вперед через Game Center).

Имеет смысл, что ваши два клиента могут соединиться, если они оба вызывают findAdditionalPlayer, так как оба вызывают addPlayersToMatch.

Если у вас уже есть игра с 2 игроками (скажем, А и В), и вы хотите, чтобы к ней присоединился третий игрок (скажем, С), вам необходимо:

В Игроке А (пригласить С):

GKMatchRequest *request = [[GKMatchRequest alloc] init];
request.minPlayers = 3;
request.maxPlayers = 4;
request.playersToInvite = [NSArray arrayWithObject:playerC_id];
[[GKMatchmaker sharedMatchmaker] addPlayersToMatch:myMatch matchRequest:request completionHandler:nil];

В Игроке B (пригласить C):

GKMatchRequest *request = [[GKMatchRequest alloc] init];
request.minPlayers = 3;
request.maxPlayers = 4;
request.playersToInvite = [NSArray arrayWithObject:playerC_id];
[[GKMatchmaker sharedMatchmaker] addPlayersToMatch:myMatch matchRequest:request completionHandler:nil];

В Игроке C (пригласите A и B):

GKMatchRequest *request = [[GKMatchRequest alloc] init];
request.minPlayers = 3;
request.maxPlayers = 4;
request.playersToInvite = [NSArray arrayWithObjects:playerA_id, playerB_id, nil];
[[GKMatchmaker sharedMatchmaker] addPlayersToMatch:myMatch matchRequest:request completionHandler:nil];

Таким образом, механизм воссоединения или добавления новых игроков в матч выглядит так:

  1. Когда игрок обнаруживает, что удаленный игрок отключился (или был добавлен совершенно новый игрок), создайте новый объект запроса на совпадение, включите только идентификатор отключенного / нового игрока в массив PlayersToInvite этого нового запроса на совпадение и выполните с ним addPlayersToMatch.
  2. Когда отключенный игрок возобновляет работу, создайте новый объект запроса на совпадение, включите все идентификаторы удаленных игроков (вам может потребоваться заранее сохранить их в массиве или получить их из свойства playerIDs вашего GKMatch) в массиве PlayersToInvite его запроса на совпадение и выполните addPlayersToMatch с этим.

Другими словами, каждый существующий игрок значительно добавляет нового игрока к своим объектам сопоставления И новый игрок значительно добавляет всех существующих игроков к своему объекту сопоставления.

Для игры на 4 игрока (игроки A, B, C и D, где игрок D является новейшим дополнением): игроки A, B и C каждый выполняют свой вызов addPlayersToMatch с объектом запроса на совпадение, у которого playerToInvite состоит только из идентификатора playerID D. Пока игрок D выполняет свой вызов addPlayersToMatch с объектом запроса на совпадение, чей массив playerToInvite содержит A, B, а также идентификаторы C игрока.

Другие вопросы по тегам