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

У меня есть приложение 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 Ответ

1 голос
/ 26 февраля 2012

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

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

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

В Игроке A (пригласить 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];

В Игроке 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 состоит только из ID игрока D. Пока игрок D выполняет свой вызов addPlayersToMatch с объектом запроса на совпадение, массив playerToInvite которого содержит A, B, а также идентификаторы playerID C.

...