Я просто не могу понять, как это работает. Я пытаюсь позволить двум игрокам играть в игру, если к ней присоединяется третий игрок, он может мгновенно присоединиться к игре, если присоединяется четвертый и последний игрок, он также может мгновенно присоединиться к игре. Они также могут покинуть игру в любое время по любой причине, если это произойдет, должно быть место, открытое для другого человека или для того же человека, чтобы повторно подключиться. Это идея.
Теперь я получил следующее. Я аутентифицирую локального игрока по понятным причинам. Затем я ищу такое совпадение:
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 каждого задействованного устройства. Что хорошо. Но есть две проблемы.
- Какое устройство должно вызывать метод addPlayersToMatch? И как вы можете ограничить его одним устройством, выполняющим этот метод? Плюс, когда вы должны это назвать?
Почему на устройстве, вызывающем этот метод, не обновляются идентификаторы playerID?
[[GKMatchmaker sharedMatchmaker] addPlayersToMatch:matchCurrent matchRequest:matchRequest completionHandler:^(NSError *error) { //matchCurrent.playerIDs is not updated?! }];
Собственно они обновлены. Когда я вижу, что идентификаторы playerID появляются на втором и третьем устройстве, я вручную обновляю matchCurrent.playerID на первом устройстве, и внезапно оно распознает игрока. Однако даже didChangeState для player не вызывается, когда новый игрок обнаруживается на первом устройстве.