Simplemente no puedo entender cómo funciona esto. Lo que intento hacer es permitir que dos jugadores jueguen un juego si un tercer jugador se une al juego y puede unirse al juego al instante. Si el cuarto y el último jugador se unen, también pueden unirse al juego al instante. También pueden abandonar el juego en cualquier momento por cualquier razón, si eso sucede, debe haber un espacio abierto para que otra persona o la misma persona puedan volver a conectarse. Esa es la idea.Game Center Encontrar una coincidencia programáticamente
Ahora lo que tengo es lo siguiente. Yo autentico al jugador local por razones obvias. Entonces busco un partido de esta manera:
if (matchRequest) [matchRequest release];
matchRequest = [[GKMatchRequest alloc] init];
matchRequest.minPlayers = 2;
matchRequest.maxPlayers = 4;
[[GKMatchmaker sharedMatchmaker] findMatchForRequest:matchRequest withCompletionHandler:^(GKMatch *match, NSError *error) {
if (error) {
// An error occured
} else {
if (matchCurrent) [matchCurrent release];
matchCurrent = [match retain];
matchCurrent.delegate = self;
}
}];
Si ejecuto esta parte de tres dispositivos diferentes, dos de ellos se encuentra uno al otro y el tercero aún está buscando. Así que pensé que después de encontrar la coincidencia para la solicitud ha encontrado la cantidad mínima de jugadores que se ejecutará una vez. Entonces, lo que necesitaba era un método que utilizara matchCurrent que retenía para agregar más jugadores. Afortunadamente, ese método existía, pero ¿cómo funcionaría? ¿Cuándo lo llamas en este caso? Decidí ponerlo debajo de un botón para poder ejecutarlo manualmente cuando se ha encontrado una coincidencia.
Lo que descubrí es que cuando lo presioné en el primer dispositivo, finalmente el tercer dispositivo pudo encontrar la coincidencia entre el primer y el segundo dispositivo. De hecho, el segundo y tercer dispositivo contenían los ID de jugador de cada dispositivo involucrado. Lo que es algo bueno. pero hay dos problemas.
- ¿Qué dispositivo debería realmente llamar al método addPlayersToMatch? ¿Y cómo puede restringirlo a un dispositivo que ejecuta ese método? Además, ¿cuándo deberías llamarlo?
¿Por qué, en el dispositivo que llama a ese método, no se actualizan los playerIDs?
[[GKMatchmaker sharedMatchmaker] addPlayersToMatch:matchCurrent matchRequest:matchRequest completionHandler:^(NSError *error) { //matchCurrent.playerIDs is not updated?! }];
Actualmente se actualizan. Cuando veo que los playerIDs aparecen en el segundo y tercer dispositivo, actualizo manualmente los matchCurrent.playerIDs en el dispositivo uno y de repente reconoce el reproductor. Sin embargo, incluso el 'didChangeState' para el jugador no se llama cuando se descubre el nuevo jugador en el dispositivo uno.
¿Es esta basado en un modelo cliente-servidor o un modelo P2P? ¿Qué se está utilizando para inicializar una conexión, tcp, udp, http? ¿Dónde se guardan los datos de los jugadores actualmente conectados? –
"Lo que trato de hacer es dejar que dos jugadores jueguen un juego si se une un tercer jugador" - ¿Se pueden agregar puntos y comas en sus oraciones segunda y tercera? Tal como están las oraciones de run-on, es difícil decir si cada cláusula-if modifica una cláusula independiente anterior o siguiente. – LarsH