2010-10-07 19 views
13

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.

  1. ¿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?
  2. ¿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.

+0

¿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? –

+3

"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

Respuesta

0

Yo sugeriría que periódicamente (quizás una vez por segundo o dos) sondeo para el estado de otros jugadores, para que pueda detectar si alguien se ha unido a, o hacia la izquierda por cualquier motivo. A menos que la arquitectura de iphone que está utilizando ya proporcione una función que maneje ese evento.

Parece que es posible que desee encontrar más documentación y/o código de muestra para el marco multijugador que está utilizando.

1

¿Qué dispositivo debería realmente llamar al método addPlayersToMatch? ¿Y cómo puede restringirlo a un dispositivo ejecutando ese método?

Puede resolver este problema haciendo que los dispositivos "dibujen pajas". Cada dispositivo genera un número aleatorio y luego lo envía a los demás. El dispositivo con el número más grande es el líder, y es el que debe llamar addPlayersToMatch. Si dos dispositivos eligen el mismo número, tire los números y comience nuevamente.

2

El uso de la clase GKMatchmaker de Apple iOS Game Center. Supongo que está utilizando una conexión de igual a igual, no alojada.

La clase GKMatch le proporciona la matriz playerIDs.

@property(nonatomic, readonly) NSArray *playerIDs 

Esta es una lista ordenada, por lo que podría ser capaz de utilizarlo para seleccionar el primer jugador addPlayersToMatch llamada.

A continuación se detalla algunos documentos.

http://developer.apple.com/library/ios/#documentation/GameKit/Reference/GKMatchmaker_Ref/Reference/Reference.html

http://developer.apple.com/library/ios/#documentation/GameKit/Reference/GKMatch_Ref/Reference/Reference.html

http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/GameKit_Guide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40008304

Cuestiones relacionadas