Game Center Поиск совпадения программно - PullRequest
13 голосов
/ 08 октября 2010

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

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

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, который я сохранил, чтобы добавить больше игроков.К счастью, этот метод существовал, но как он будет работать?Когда вы называете это в этом случае?Я решил поместить его под кнопку, чтобы можно было вручную выполнить его, когда совпадение найдено.

Я обнаружил, что когда я нажимал на первом устройстве, наконец, третье устройство могло найти совпадение.первое и второе устройства были на самом деле. На самом деле второе и третье устройства содержали идентификаторы игроков каждого задействованного устройства.Что хорошо.Но есть две проблемы:

  1. Какое устройство на самом деле должно вызывать метод addPlayersToMatch?И как вы можете ограничить это одним устройством, выполняющим этот метод?Кроме того, когда вы должны вызывать его?
  2. Почему на устройстве, вызывающем этот метод, не обновляются идентификаторы игроков?

    [[GKMatchmaker sharedMatchmaker] addPlayersToMatch:matchCurrent matchRequest:matchRequest completionHandler:^(NSError *error) {
        //matchCurrent.playerIDs is not updated?!
    }]; 
    

    На самом деле они обновляются.Когда я вижу, что идентификаторы игроков появляются на втором и третьем устройствах, я вручную обновляю идентификаторы matchCurrent.player на первом устройстве, и вдруг он распознает плеер.Однако даже «didChangeState» для игрока не вызывается, когда новый игрок обнаружен на первом устройстве.

Ответы [ 3 ]

2 голосов
/ 17 ноября 2010

Вы используете игровой центр Apple iOS GKMatchmaker. Я предполагаю, что вы используете одноранговое соединение, а не размещенное.

Класс 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

1 голос
/ 14 ноября 2010

Какое устройство на самом деле должно вызывать метод addPlayersToMatch? И как можно Вы ограничиваете это одним устройством выполнить этот метод?

Вы можете решить эту проблему, если бы устройства "рисовали соломинки". Каждое устройство генерирует случайное число, а затем отправляет его другим. Устройство с наибольшим номером является лидером, и именно оно должно вызывать addPlayersToMatch. Если два устройства выбирают один и тот же номер, выбросьте цифры и начните все сначала.

0 голосов
/ 14 ноября 2010

Я бы посоветовал вам периодически (может быть, раз в секунду или два) опрашивать статус других игроков, чтобы вы могли определить, присоединился ли кто-либо или ушел по какой-либо причине. Если архитектура iphone, которую вы используете, уже предоставляет функцию, которая обрабатывает это событие.

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

...