2011-01-01 49 views
6

EDIT: He hecho un proyecto nuevo y limpio, pero todavía no puedo ponerlo en funcionamiento. Descárguelo, hay un pequeño código para mirar y probablemente sea fácil para un profesional o cualquier otra persona que experimente de forma remota ver lo que estoy haciendo mal. Estoy tratando de enviar ese número entero.Game Center - Envío y recepción de datos

http://www.2shared.com/file/fPOCLlg5/gkTest.html

Hola

Estoy tratando de poner en práctica centro de juego de varios jugadores en mi juego iphone y tener problemas para entender las muestras que tengo a la mano en la manzana Docs y procedente de terceros por el envío y recepción de datos.

Podría alguien explicar los ejemplos de código en la documentación oficial de Apple aquí, por favor: http://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/GameKit_Guide/MatchesandVoice/MatchesandVoice.html#//apple_ref/doc/uid/TP40008304-CH10-SW4

O ayudarme a averiguar este código de ejemplo que se suministró con. Es una clase de pre-compilados, hecha para manejar todas las tareas centro de juego y una muestra de que para el envío y recepción de datos sería la siguiente:

- (void) sendPosition 
{ 
    NSError *error; 
    PositionPacket msg; 
    msg.messageKind = PositionMessage; 
    msg.x = currentPosition.x; 
    msg.y = currentPosition.y; 
    NSData *packet = [NSData dataWithBytes:&msg length:sizeof(PositionPacket)]; 
    [match sendDataToAllPlayers: packet withDataMode: GKMatchSendDataUnreliable error:&error]; 
    if (error != nil) 
    { 
     // handle the error 
    } 
} 

y recibir:

- (void)match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID 
{ 
    Packet *p = (Packet*)[data bytes]; 
    if (p.messageKind == PositionMessage) 
     // handle a position message. 
} 

Mi gran pregunta acerca de este código de los documentos oficiales es:

¿De dónde viene PositionPacket/Packet? Y suponiendo que cuando se quiere enviar/recibir datos se les llama así:

[self sendPosition]; 

o

[self match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID]; 

Qué puedo entrar como los partidos, datos y playerId?

E.g. Tengo una int llamada 'puntuación' pero ¿no hay una clave especial que necesito para usar algo?

Respuesta

18

En este ejemplo, el PositionPacket es solo una estructura. La siguiente línea coloca esa estructura en un NSData que es solo un objeto de "cubo de bytes".

NSData *packet = [NSData dataWithBytes: &msg length: sizeof(PositionPacket)]; 

Así que si sólo quería enviar una puntuación int, usted podría tener un método sendScore que se veía así:

- (void) sendScore 
{ 
    NSError *error; 
    int myScore = self.score; 
    NSData *packet = [NSData dataWithBytes:&myScore length:sizeof(myScore)]; 
    [match sendDataToAllPlayers: packet withDataMode: GKMatchSendDataUnreliable error: &error]; 
    if (error != nil) 
    { 
     // handle the error 
    } 
} 

Por lo general, usted querrá una estructura para que haya alguna información adicional eso les permite a los receptores saber qué tipo de datos son. En el ejemplo, que habría sido el propósito de esta línea:

msg.messageKind = PositionMessage; 

En general, puede enviar cualquier cosa que usted quiere encapsulado en un objeto NSData, ya que es sólo un cubo de bytes. Puede enviar tipos primitivos como ints, o structs como en el ejemplo, o incluso NSObjects (siempre que implementen NSCoding). Debería leer NSKeyedArchiver, NSCoding y NSData para obtener más información sobre cómo enviar y recibir NSObjects de esta manera. Aquí está el documento de referencia de Apple en Archving.

En cuanto a la recepción, NO llama al método, el kit lo llama a usted.Es lo que se llama un "método delegado" (en el lenguaje Cocoa) o un "método de devolución de llamada". Puedes pensar que es como una "llamada telefónica" que tu aplicación puede recibir de manera asincrónica. Mediante la implementación de un método con la firma:

- (void)match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID; 

... que está diciendo "yo puedo recibir este tipo de llamadas telefónicas". Por lo tanto, cuando el GameKit reciba datos de otro jugador en su nombre, verá que desea recibir devoluciones de llamadas de ese tipo y luego llamará a ese método, luego le corresponde a usted actualizar su estado interno de aplicación según lo que se reciba.

Para continuar con este ejemplo, si se hubiera enviado la simple "nada más que un entero" mensaje ha descrito anteriormente, es posible implementar ese método como este:

- (void)match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID 
{ 
    int* receivedScorePtr = (int*)[data bytes]; 
    int receivedScore = *receivedScorePtr; 
    [self updateScore: received forPlayer: playerID]; 
} 

Eso es, por supuesto, asumiendo que tener un método llamado updateScore: forPlayer: eso actualizaría una tabla de puntajes.

puede encontrar una discusión/explicación más general de cómo los delegados y los métodos de delegar el trabajo en esta entrada de blog: http://mohrt.blogspot.com/2010/01/cocoa-and-delegates.html

añadido: Mediante el código del autor de la pregunta publicada, hice algunas modificaciones y produjo una versión que "funciona" para este caso de uso básico. Working Version of Test App To Send One Integer Through GameCenter No afirmo nada sobre la calidad del código o su idoneidad para, bueno, nada. No escribí el 99.9% de él, por favor no tome mi publicación aquí como un endoso de cualquier cosa que aparezca en él.

Una de las lecciones aprendidas (que no sabía, por lo tanto, lo estoy esperando con la esperanza de que ayude a los demás) es que no puede usar el servicio Matchmaking con el simulador. Esto significa que necesita dos dispositivos iOS aprovisionados para el desarrollo con el fin de probar este escenario, y probablemente, para los programas no triviales, dos máquinas de desarrollo para depurar ambos dispositivos simultáneamente. Este problema me costó la mayor parte del tiempo mientras descubría esto.

+0

Esto es genial, muchas gracias! Tiene mucho más sentido, aunque en cuanto al "partido", ¿es solo un nuevo GKMatch que puedo declarar o necesita ser de un lugar específico? –

+0

En el caso de este método, la coincidencia se transfiere a usted. Sospecho que en el caso simple (es decir, un solo juego a la vez) que no necesita preocuparse por eso/hacer algo con él en estos métodos. Si busca más información sobre los partidos en general, provienen del servicio Matchmaking. Detalles aquí: http://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/GameKit_Guide/MatchesandVoice/MatchesandVoice.html#//apple_ref/doc/uid/TP40008304-CH10-SW9 – ipmcc

+0

Entiendo que la recepción El método de datos nos da la 'coincidencia 'de GKMatch, pero ¿de dónde viene' match' en el método sendScore? –

Cuestiones relacionadas