Не удается добавить дополнительных игроков с помощью [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];
Таким образом, механизм воссоединения или добавления новых игроков в матч выглядит так:
- Когда игрок обнаруживает, что удаленный игрок отключился (или был добавлен совершенно новый игрок), создайте новый объект запроса на совпадение, включите только идентификатор отключенного / нового игрока в массив PlayersToInvite этого нового запроса на совпадение и выполните с ним addPlayersToMatch.
- Когда отключенный игрок возобновляет работу, создайте новый объект запроса на совпадение, включите все идентификаторы удаленных игроков (вам может потребоваться заранее сохранить их в массиве или получить их из свойства playerIDs вашего GKMatch) в массиве PlayersToInvite его запроса на совпадение и выполните addPlayersToMatch с этим.
Другими словами, каждый существующий игрок значительно добавляет нового игрока к своим объектам сопоставления И новый игрок значительно добавляет всех существующих игроков к своему объекту сопоставления.
Для игры на 4 игрока (игроки A, B, C и D, где игрок D является новейшим дополнением): игроки A, B и C каждый выполняют свой вызов addPlayersToMatch с объектом запроса на совпадение, у которого playerToInvite состоит только из идентификатора playerID D. Пока игрок D выполняет свой вызов addPlayersToMatch с объектом запроса на совпадение, чей массив playerToInvite содержит A, B, а также идентификаторы C игрока.