2011-03-31 4 views
8

Estoy obteniendo un comportamiento que no puedo decodificar de GameKit.problemas para negociar un partido de 2 jugadores en el juego kit

veces el jugador que ha realizado la invitación se queda atascado en un bucle de 'espera ...' y no puede cerrar el trato con su invitación.

Creo que tiene que ver con la multitarea y el controlador de invitación ... parece que si la aplicación del invitado comienza desde cero, entonces la invitación puede aceptarse correctamente. Pero el mecanismo de esto no es tan transparente para mí.

¿Alguna pista sobre lo que podría faltar? Me he quedado ciego por la documentación.

+0

que enfrentan a los mismos problemas también ... normalmente la aplicación necesita un "nuevo comienzo" y funciona de nuevo ... – xuanweng

+1

xuanweng, creo que encontré una solución ... se recomienda en la documentación que inviteHandler esté preparado en el bloque de finalización de authenticateLocalPlayerWithCompletionBlock. Había establecido mi prepareInviteHandler para ser llamado en el bloque if (error == nil). Poner la llamada para preparar el manejador de invitación antes de esta instrucción if/then (proporcionada en el código de documentación) parece suavizar este problema. –

+0

Debe enviar esto como una respuesta y aceptar su propia respuesta para marcar la pregunta como resuelta. –

Respuesta

1

A veces, cuando se inicia una coincidencia entre dos jugadores, es posible que un jugador aún no tenga el estado conectado. Debes verificar si se espera que más jugadores se conecten antes de comenzar realmente el juego. Si es mayor a 0, en lugar de comenzar el juego, espere a que el jugador se conecte, y solo comience el juego cuando ese jugador esté conectado.

lo tanto, el código sería algo como esto dentro de su método en el que está configurando el juego:

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

Y se pondría en práctica este método delegado:

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