Game Center Программный поиск совпадения

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

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

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

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

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

      [[GKMatchmaker sharedMatchmaker] addPlayersToMatch: matchCurrent matchRequest: matchRequest ЗавершениеHandler: ^ (NSError * ошибка) {
     //matchCurrent.playerIDs не обновляется ?!
    }]; 
    

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

13
задан Mark 7 October 2010 в 20:02
поделиться