2010-10-07 4 views
13

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

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

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 каждого устройства. Что хорошо. Но есть две проблемы.

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

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

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

+0

ли это на основе модели клиент-сервер или модель p2p? Что используется для инициализации соединения, tcp, udp, http? Где хранятся данные для подключенных в данный момент игроков? –

+3

«То, что я пытаюсь сделать, это позволить двум игрокам играть в игру, если присоединяется третий игрок». Можете ли вы добавить несколько точек с запятой и запятыми в свои 2 и 3 предложения? Как и в предвыборных предложениях, трудно определить, изменяет ли каждое if-предложение предыдущее или следующее независимое предложение. – LarsH

ответ

0

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

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

1

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

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

2

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

Класс GKMatch предоставляет вам массив идентификаторов игроков.

@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