Игровой центр Поиск соответствия программно

Я просто не могу понять, как это работает. То, что я пытаюсь сделать, это позволить двум игрокам играть в игру, если третий игрок присоединяется к ней, может мгновенно присоединиться к игре, если четвертый и последний игрок присоединятся к ней, она также может мгновенно присоединиться к игре. Они могут также покинуть игру в любое время по любой причине, если это произойдет, должно быть пространство, открытое для другого человека или для того, чтобы тот же человек снова подключался. Это идея.

Теперь я получил следующее. Я удостоверяю локальный игрок по очевидным причинам. Затем я ищу подходящее совпадение:

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 уже предоставляет функцию, которая обрабатывает это событие.

Похоже, вы можете захотеть найти дополнительную документацию и/или образец кода для используемой вами многопользовательской структуры.