2011-01-25 11 views
5

Sto cercando di utilizzare Game Center: multi playerGame Center: partita delegato non è chiamato dopo aver trovato una corrispondenza

Fino ad ora, i giocatori sono l'autenticazione a Game Center, possono inviare/leggere colonne sonore, e acheivements. Per le funzionalità multiplayer, ho provato entrambi i metodi: - utilizzando l'interfaccia Game Center per trovare una corrispondenza. - Trova una corrispondenza a livello di programmazione.

Per entrambi i modi ho il seguente problema: corrispondenza del delegato della partita: player: didChangeState: il metodo non viene chiamato. In apple docs, si afferma che questo delegato viene chiamato se un giocatore è connesso o disconnesso.

Nel mio caso questo delegato non viene mai chiamato. Penso che mi manca un passaggio. qui dopo l'implementazione del mio delegato (come specificato in 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. 
    } 
} 

e anche il codice per trovare una corrispondenza.

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

Grazie per il vostro aiuto.

risposta

1

Stava lavorando tutto il tempo. L'unica differenza è che ... quando si utilizza invita l'evento "didChangeState" non viene chiamato. Sei connesso senza preavviso e puoi iniziare a ricevere dati. Non ho mai provato a inviare/ricevere dati perché mi aspettavo prima l'evento, ma ho inviato qualcosa per errore una volta, e ha funzionato.

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

Il codice sopra riportato funziona come previsto.

+0

Non credo che questo sia vero. Ho appena provato con la corrispondenza automatica e non ha mai sparato aChangeState. Solo FindMatch. Penso che lo scambio di dati potrebbe accadere solo se un giocatore entra in GKPlayerStateUnknown e poi torna indietro o se viene aggiunto a una partita in corso. –

0

Penso che DataChangeState: GKPlayerStateConnected possa accadere solo se un giocatore era GKPlayerStateUnknown e poi torna indietro, o se sono stati aggiunti/invitati a una partita in corso.

Problemi correlati