2011-03-31 5 views
8

Je reçois un comportement que je ne peux pas décoder de GameKit. Le joueur qui a lancé l'invocation est bloqué dans une boucle d'attente et ne parvient pas à fermer la transaction sur son invitation. Je crois que cela a à voir avec le multitâche et le gestionnaire d'invitation ... il semble que si l'application de l'invité commence à partir de zéro, alors l'invitation peut être correctement acceptée. Mais le mécanisme de ceci n'est pas si transparent pour moi.difficulté à négocier un match de 2 joueurs dans le kit de jeu

Des indices sur ce qui pourrait manquer? Je suis devenu aveugle par la documentation.

+0

Je face aux mêmes problèmes trop .. généralement l'application a besoin d'un "nouveau départ" et il fonctionne à nouveau ... – xuanweng

+1

xuanweng, je crois que j'ai trouvé une solution ... il est recommandé dans la documentation que le guestHandler soit préparé dans le bloc d'achèvement de l'authenticateLocalPlayerWithCompletionBlock. J'avais mis mon prepareInviteHandler à appeler dans le bloc if (error == nil). Mettre l'appel à préparer le gestionnaire d'invite avant cette instruction if/then (fournie dans le code de la documentation) semble atténuer ce problème. –

+0

Vous devez soumettre ceci comme réponse et accepter votre propre réponse pour marquer la question comme résolue. –

Répondre

1

Parfois, lorsqu'un match entre deux joueurs commence, il est possible qu'un joueur n'ait pas encore l'état connecté. Vous devriez vérifier si plus de joueurs sont censés se connecter avant de commencer le jeu. Si c'est au-dessus de 0, au lieu de commencer le jeu, attendez que le joueur se connecte, et commencez seulement le jeu quand ce joueur est connecté.

Ainsi, le code ressemblerait à quelque chose comme ceci dans votre la méthode où vous configurez le jeu:

if (currentMatch.expectedPlayerCount) { 
    waiting = YES; 
} 

Et vous mettrait en œuvre cette méthode déléguée:

- (void)match:(GKMatch *)match player:(NSString *)playerID didChangeState:(GKPlayerConnectionState)state 
{ 
    if (state == GKPlayerStateConnected) { 
     if (waiting) { 
      waiting = NO; 
      // start the game now 
     } 
    } else if (state == GKPlayerStateDisconnected) { 
     // handle disconnect 
    } 
} 
Questions connexes