2011-01-01 18 views
6

EDYCJA: Zrobiłem czysty, nowy projekt, ale nadal nie mogę go uruchomić. Pobierz go, jest mały kod do obejrzenia i prawdopodobnie łatwy dla profesjonalisty lub kogokolwiek, kto zdalnie doświadcza, aby zobaczyć, co robię źle. Próbuję wysłać tę liczbę całkowitą.Game Center - Wysyłanie i odbieranie danych

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

Hi

Próbuję zaimplementować Centrum gier multiplayer w moim iPhone gry i kłopoty zrozumienia próbki mam pod ręką w Apple Docs i od stron trzecich dotyczących wysyłania i odbierania danych.

Może ktoś proszę wyjaśnić próbki kodu w Oficjalnych docs firmy Apple tu proszę: http://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/GameKit_Guide/MatchesandVoice/MatchesandVoice.html#//apple_ref/doc/uid/TP40008304-CH10-SW4

Albo mi pomóc dowiedzieć się ten przykładowy kod I został dostarczony wraz. Jego Montowane klasy, wykonane obsługiwać wszystkie gry zadania Center oraz próbki z nim przez wysyłanie i odbieranie danych byłoby to:

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

i odbierania:

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

Moje wielkie pytanie o kodzie oficjalny dokument to:

Skąd pochodzi PositionPacket/Packet? I zakładając, gdy chcesz wysyłać/odbierać dane nazwać je tak:

[self sendPosition]; 

lub

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

Co mam wpisać w tym meczu, danych i playerID?

E.g. Mam int nazwany "score", ale czy nie ma specjalnego klucza, którego potrzebuję użyć coś?

Odpowiedz

18

W tym przykładzie PositionPacket jest po prostu strukturą. Poniższa linia umieszcza tę strukturę w NSData, który jest tylko obiektem "bajtowym wiadrem".

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

Więc jeśli po prostu chciałem, aby wysłać wynik int, można mieć metodę sendScore który wyglądał tak:

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

Zazwyczaj będziemy chcieli struct tak, że istnieje kilka dodatkowych informacji dzięki czemu odbiorcy wiedzą, jakie to dane. W przykładzie, który byłby celem tej linii:

msg.messageKind = PositionMessage; 

w ogóle, można wysłać cokolwiek chcesz zamknięty w obiekcie NSData, gdyż jest to po prostu wiadro bajt. Możesz wysyłać typy pierwotne, takie jak ints lub structs, jak w przykładzie, lub nawet NSObjects (o ile implementują NSCoding). Powinieneś przeczytać na NSKeyedArchiver, NSCoding i NSData więcej informacji na temat wysyłania i odbierania NSObjects w ten sposób. Oto dokument referencyjny firmy Apple pod adresem Archving.

Jeśli chodzi o odbieranie, TY nie wywołasz tej metody, zostanie ona wywołana NA Tobie przez zestaw.Jest to tak zwana "metoda delegata" (w języku kakao) lub "metoda wywołania zwrotnego". Możesz to traktować jako "połączenie telefoniczne", które Twoja aplikacja może odbierać asynchronicznie. Wprowadzając metodę z podpisem:

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

... mówisz "Mogę otrzymać tego rodzaju telefon". Więc kiedy GameKit otrzyma dane w twoim imieniu od innego gracza, zobaczy, że chcesz odbierać tego typu callbacki, a następnie wywoła tę metodę - wtedy od Ciebie zależy aktualizacja wewnętrznego stanu aplikacji na podstawie otrzymanych informacji.

Aby kontynuować ten przykład, jeśli wysłał proste „nic oprócz liczby całkowitej” wiadomość opisanej powyżej, można wdrożyć tę metodę tak:

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

To jest, oczywiście, przy założeniu, że ciebie mieć metodę o nazwie updateScore: forPlayer: która aktualizowałaby tabelę wyników.

Można znaleźć więcej Dyskusja ogólna/wyjaśnienie, w jaki delegaci i metody powierzyć pracę na tym blogu: http://mohrt.blogspot.com/2010/01/cocoa-and-delegates.html

Dodano: użyciu kodu Pytający pisał, zrobiłem kilka modyfikacji i wyprodukowała wersję "działa" w tym przypadku użycia gołe kości. Working Version of Test App To Send One Integer Through GameCenter Nie twierdzę, że jakość kodu lub jego przydatność do ... cokolwiek w ogóle. Nie napisałem tego w 99,9% - proszę, nie prześlijcie mi tego tutaj, jako poparcia dla wszystkiego, co się w nim pojawia.

Jedną z lekcji, których się nauczyłem (nie wiedziałem, więc liczę na to, że pomaga to innym) jest to, że nie można korzystać z usługi Matchmaking z symulatorem. Oznacza to, że do testowania tego scenariusza potrzebne są dwa urządzenia z systemem iOS z obsługą programistyczną. Prawdopodobnie w przypadku nietrywialnych programów dwie maszyny programistyczne będą jednocześnie debugować oba urządzenia. Ten problem kosztował mnie najwięcej czasu, gdy się nad tym zastanawiałem.

+0

To świetnie, wielkie dzięki! Mają o wiele więcej sensu, chociaż tak jak w przypadku "meczu" jest to tylko nowy GKMatch, który mogę zadeklarować, czy też musi pochodzić z określonego miejsca? –

+0

W przypadku tej metody mecz zostanie przekazany użytkownikowi. Podejrzewam, że w tym prostym przypadku (tj. Tylko jedna gra dzieje się w tym samym czasie), że nie musisz się o to martwić/robić nic w tych metodach. Jeśli szukasz więcej informacji o meczach w ogóle, pochodzą one z usługi Matchmaking. Szczegóły tutaj: http://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/GameKit_Guide/MatchesandVoice/MatchesandVoice.html#//apple_ref/doc/uid/TP40008304-CH10-SW9 – ipmcc

+0

Rozumiem, że otrzymane metoda danych daje nam "dopasowanie" GKMatch, ale skąd pochodzi metoda 'match' w metodzie sendScore? –

Powiązane problemy