Game Center Multiplayer с использованием GKMatch, но, кажется, не может быть подключен - PullRequest
4 голосов
/ 02 декабря 2010

Привет, я новичок в Game Center для iOS. Я пытаюсь добавить многопользовательскую функцию, используя спички в своей игре и следуя документации.

До сих пор я достиг точки, когда 2 моих клиента могут успешно получить совпадение, то есть вызывается обратный вызов matchmakerViewController: didFindMatch и доставляется объект GKMatch.

Однако после этого я, кажется, застрял там навсегда, потому что согласно документации, мне придется подождать, пока все игроки (2 в моем случае) действительно подключатся, прежде чем начинать игру. Но кажется, что обратный вызов match: player: didChangeState никогда не вызывается для указания успешного соединения. Ну, я уверен, что все мои клиенты находятся в одной и той же сети Wi-Fi (или это обязательно?) Может ли кто-нибудь просветить меня по этому делу? Нужно ли делать какие-то дополнительные действия, чтобы клиенты могли подключаться? Большое спасибо за помощь!

Ответы [ 6 ]

3 голосов
/ 19 января 2011

Так что я столкнулся с этим, и решение (для меня) несколько смутило.Я скопировал и вставил кучу кода из документов Apple ... и они упустили очевидный шаг.На самом деле они никогда не устанавливают делегата совпадения!

Мой код теперь таков:

- (void)matchmakerViewController:(GKMatchmakerViewController *)viewController didFindMatch:(GKMatch *)match {
[self dismissModalViewControllerAnimated:YES];
self.myMatch = match; // Use a retaining property to retain the match.
self.myMatch.delegate = self;  // THIS LINE WAS MISSING IN THE APPLE DOCS.  DOH.
// Start the game using the match.
NSLog(@"Match started! Expected Player Count:%d  %@",match.expectedPlayerCount, match.playerIDs);}

Как только я на самом деле установил делегата совпадения, функции вызывают.Doh.

2 голосов
/ 13 декабря 2010

Когда вы получите объект GKMatch, обязательно проверьте свойствоpectedPlayerCount. Возможно, что другой игрок уже подключен, и поэтому вы не получите совпадения: player: didChangeState для делегата.

1 голос
/ 16 июня 2011

Это работало все время.Разница лишь в том, что ... при использовании приглашений событие "didChangeState" не вызывается.Вы подключены без уведомления, и вы можете начать получать данные.Я никогда не пытался отправлять / получать данные ... Потому что я ожидал события первым, но однажды отправил что-то по ошибке, и это сработало.:)

- (void)matchmakerViewController:(GKMatchmakerViewController *)viewController didFindMatch:(GKMatch *) match {    
    //Dismiss window
    [self dismissModalViewControllerAnimated:YES];

    //Retain match
    self.myMatch = match; 

    //Delegate
    myMatch.delegate = self;


    //Flag
    matchStarted = TRUE;

   //Other stuff
}

- (void)match:(GKMatch *)match player:(NSString *)playerID didChangeState:(GKPlayerConnectionState)state  {
    //This code gets called only on auto-match
}

Вышеприведенный код работает как положено.

1 голос
/ 25 февраля 2011

Внутри вашего обратного вызова matchmakerViewController: didFindMatch

Добавьте этот код, и вы увидите, что GC

вызывает обратный вызов "match: player: didChangeState"
GKMatchRequest *request = [[[GKMatchRequest alloc] init] autorelease];
    request.minPlayers = 2;
    request.maxPlayers = 2;
    [[GKMatchmaker sharedMatchmaker] addPlayersToMatch:match matchRequest:request completionHandler:^(NSError* error) {
        if(error)
            NSLog(@"Error adding player: %@", [error localizedDescription]);
    }];
1 голос
/ 30 декабря 2010

У меня была такая же проблема с другом. Решение было довольно странным, но потом оно работает. На всех устройствах вы должны включить Уведомления (Звуки / Предупреждения / Значки) для Game Center в параметрах Настройки / Уведомления. После этого мы смогли установить соединение и получили объект соответствия

0 голосов
/ 02 декабря 2010

Убедитесь, что вы установили свой класс в качестве делегата для GKSession. Класс должен будет реализовать протокол GKSessionDelegate ... в противном случае он никогда не получит этот обратный вызов. Вот справочник по протоколу . Надеюсь, это поможет!

...