Game Center: делегат матча не вызывается после нахождения матча - PullRequest
5 голосов
/ 25 января 2011

Я пытаюсь использовать игровой центр: многопользовательский режим

До сих пор игроки проходили аутентификацию в Игровом центре, они могли отправлять / читать результаты и достижения.Для многопользовательских функций я попробовал оба способа: - использовать интерфейс Game Center, чтобы найти совпадение.- Найти совпадение программно.

Для обоих способов у меня возникает следующая проблема: совпадение делегата матча: player: didChangeState: метод не вызывается.В Apple Docs указано, что этот делегат вызывается, если один игрок подключен или отключен.

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

- (void)match:(GKMatch *)match player:(NSString *)playerID didChangeState:(GKPlayerConnectionState)state
{
    switch (state)
    {
        case GKPlayerStateConnected:
            // handle a new player connection.
           break;
        case GKPlayerStateDisconnected:
            // a player just disconnected.
           break;
    }
    if (!self.matchStarted && match.expectedPlayerCount == 0)
    {
        self.matchStarted = YES;
        // handle initial match negotiation.
    }
}

, а также код для поиска соответствия.

-(void) findProgrammaticMatch
{
  GKMatchRequest *request = [[[GKMatchRequest alloc] init] autorelease];
  request.minPlayers = 2;
  request.maxPlayers = 2;

  [[GKMatchmaker sharedMatchmaker] findMatchForRequest:request
                                 withCompletionHandler:^(GKMatch *FoundMatch, NSError *error)
  {
    if (error)
    {
      // Process the error.
      StatusLabel.text = @"Match Not Found";
    }
    else if (FoundMatch != nil)
    {
      MultiPlayerMatch = FoundMatch; // Use a retaining property to retain the match.
      StatusLabel.text = @"Match Found";
      MultiPlayerMatch.delegate = self; // start!
      // Start the match.
      // Start the game using the match.
      [self StartMatch];
    }
  }];
}

Спасибо за вашу помощь.

Ответы [ 2 ]

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
}

Приведенный выше код работает, как и ожидалось.

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

Я думаю, что didChangeState: GKPlayerStateConnected может произойти только в том случае, если игрок был GKPlayerStateUnknown и затем возвращается, или если они добавляются / приглашаются обратно в ходе матча.

...