2011-01-25 19 views
5

Estoy tratando de utilizar el centro de juego: multijugadorGame Center: delegado partido no se le llama después de encontrar un donante compatible

Hasta ahora, los jugadores se van a autenticar al centro de juego, pueden enviar/leer partituras, y acheivements. Para funciones de varios jugadores, probé ambos métodos: - usando la interfaz del centro de juegos para encontrar una coincidencia. - Encuentre una coincidencia mediante programación.

Para ambos sentidos, tengo el siguiente problema: el partido del delegado del partido: player: didChangeState: method no se llama. En Apple Docs, se indica que se llama a este delegado si un jugador está conectado o desconectado.

En mi caso, nunca se llama a este delegado. Creo que me falta un paso. aquí después de la implementación de mi delegado (como se especifica en 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. 
    } 
} 

y también el código para encontrar una coincidencia.

-(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]; 
    } 
    }]; 
} 

Gracias por su ayuda.

Respuesta

1

Estuvo trabajando todo el tiempo. La única diferencia es que ... cuando se utiliza invita al evento "didChangeState" no se llama. Estás conectado sin previo aviso y puedes comenzar a recibir datos. Nunca intenté enviar/recibir datos porque esperaba el evento primero, pero sí envié algo por error una sola vez, y funcionó.

- (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 
} 

El código anterior funciona como se esperaba.

+0

No creo que esto sea cierto. Acabo de probar con la coincidencia automática y didChangeState nunca se dispara. Solo didFindMatch. Creo que didChangeState solo puede suceder si un jugador ingresa a GKPlayerStateUnknown y luego regresa, o si se agregan a una partida en progreso. –

0

Creo que didChangeState: GKPlayerStateConnected solo puede suceder si un jugador era GKPlayerStateUnknown y luego regresa, o si se agregan/invitan a una partida en progreso.

Cuestiones relacionadas