Игровой центр Поиск соответствия программно
Я просто не могу понять, как это работает. То, что я пытаюсь сделать, это позволить двум игрокам играть в игру, если третий игрок присоединяется к ней, может мгновенно присоединиться к игре, если четвертый и последний игрок присоединятся к ней, она также может мгновенно присоединиться к игре. Они могут также покинуть игру в любое время по любой причине, если это произойдет, должно быть пространство, открытое для другого человека или для того, чтобы тот же человек снова подключался. Это идея.
Теперь я получил следующее. Я удостоверяю локальный игрок по очевидным причинам. Затем я ищу подходящее совпадение:
if (matchRequest) [matchRequest release];
matchRequest = [[GKMatchRequest alloc] init];
matchRequest.minPlayers = 2;
matchRequest.maxPlayers = 4;
[[GKMatchmaker sharedMatchmaker] findMatchForRequest:matchRequest withCompletionHandler:^(GKMatch *match, NSError *error) {
if (error) {
// An error occured
} else {
if (matchCurrent) [matchCurrent release];
matchCurrent = [match retain];
matchCurrent.delegate = self;
}
}];
Если я исполню эту часть на трех разных устройствах, два из них найдут друг друга, а третий по-прежнему будет смотреть. Поэтому я решил, что после того, как матч поиска для запроса нашел минимальное количество игроков, он будет выполнен один раз. Так что мне нужен был метод, который использовал matchCurrent, который я сохранил, чтобы добавить больше игроков. К счастью, этот метод существует, но как это будет работать? Когда вы называете это в этом случае? Я решил поставить его под кнопку, чтобы я мог вручную выполнить его, когда совпадение найдено.
Что я обнаружил, так это то, что когда я нажал его на первом устройстве, наконец, третье устройство могло найти совпадение с первым и вторым устройством. Фактически второе и третье устройства содержали идентификаторы player каждого устройства. Что хорошо. Но есть две проблемы.
- Какое устройство должно фактически вызвать метод addPlayersToMatch? И как вы можете ограничить его одним устройством, выполняющим этот метод? Плюс, когда вы это называете?
-
Почему на устройстве, вызывающем этот метод, не обновляется идентификатор игрока?
[[GKMatchmaker sharedMatchmaker] addPlayersToMatch:matchCurrent matchRequest:matchRequest completionHandler:^(NSError *error) {
//matchCurrent.playerIDs is not updated?!
}];
На самом деле они обновляются. Когда я вижу, что идентификаторы player появляются на втором и третьем устройствах, я вручную обновляю идентификаторы matchCurrent.playerID на устройстве один, и вдруг он распознает плеер. Однако даже "didChangeState" для игрока не вызывается, когда новый игрок обнаружен на одном устройстве.
Ответы
Ответ 1
Использование вами класса GKMatchmaker в игровом центре Apple iOS. Я предполагаю, что вы используете одноранговое соединение, а не размещено.
Класс GKMatch предоставляет массив playerIDs.
@property(nonatomic, readonly) NSArray *playerIDs
Это упорядоченный список, поэтому вы можете использовать его для выбора первого вызова игрока addPlayersToMatch.
Ниже приведена документация.
http://developer.apple.com/library/ios/#documentation/GameKit/Reference/GKMatchmaker_Ref/Reference/Reference.html
http://developer.apple.com/library/ios/#documentation/GameKit/Reference/GKMatch_Ref/Reference/Reference.html
http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/GameKit_Guide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40008304
Ответ 2
Какое устройство должно называть Метод addPlayersToMatch? И как можно вы ограничиваете его одним устройством выполнение этого метода?
Вы можете решить эту проблему, если устройства "соломинки". Каждое устройство генерирует случайное число, а затем отправляет его другим. Устройство с наибольшим числом является лидером, и именно тот, который должен вызывать addPlayersToMatch. Если два устройства выбирают один и тот же номер, выкидывают номера и начинаются.
Ответ 3
Я предлагаю вам периодически (возможно, один раз в секунду или два) опросить статус других игроков, чтобы вы могли определить, присоединился ли кто-нибудь или ушел по какой-либо причине. Если используемая вами архитектура iphone уже предоставляет функцию, которая обрабатывает это событие.
Похоже, вы можете захотеть найти дополнительную документацию и/или образец кода для используемой вами многопользовательской структуры.