2011-01-01 2 views
6

편집 : 깨끗하고 새로운 프로젝트를 만들었지 만 여전히 제대로 작동하지 않습니다. 그것을 다운로드하십시오, 거기에 약간의 코드를 볼 수 있으며 아마 전문가 또는 누구나 원격 경험을 내가 뭘 잘못하고 있는지 볼 수 있습니다. 그냥 그 정수를 보내려고.Game Center - 데이터 송수신

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

안녕 내 아이폰 게임에서 게임 센터 멀티를 구현하기 위해 노력하고 내가 애플 문서 도구의 손과 전송하고 데이터를 수신와 관련된 타사에서이 샘플을 이해하는 데 문제가 있어요

. http://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/GameKit_Guide/MatchesandVoice/MatchesandVoice.html#//apple_ref/doc/uid/TP40008304-CH10-SW4

또는 제가 함께 제공된이 샘플 코드를 알아내는 데 도움이 :

누군가는 여기에 공식 애플 문서의 코드 샘플을하시기 바랍니다 설명해 주 시겠어요. 될 데이터를 전송 및 수신을 위해 모든 게임 센터 작업 및 샘플을 처리하기 위해 만든 그것의 미리 만들어진 클래스,이 :

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

그리고 수신 :이 코드에 대한

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

내 큰 문제를 공식 문서 양식은 다음과 같습니다.

PositionPacket/Packet은 어디에서 왔습니까? 그리고 당신은 당신과 같이 그들에게 전화 데이터를 송/수신 할 때 가정 :

[self sendPosition]; 

또는 I 경기, 데이터 및 playerID로 입력하는 일

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

?

예. 나는 'score'라는 이름의 int를 가지고 있지만, 뭔가를 사용해야하는 특별한 키가 없는가?

답변

18

이 예제에서 PositionPacket은 단지 구조체입니다. 다음 줄은 그 구조체를 단지 "바이트 버킷"객체 인 NSData에 넣습니다.

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

그래서 그냥 int로 점수를 전송하기를 원한다면, 당신이 닮은 sendScore 방법 할 수 : 몇 가지 추가 정보가있을 수 있도록 일반적으로

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

을, 당신은 구조체를 할 것입니다 이는 수신기가 어떤 종류의 데이터인지 알 수있게 해줍니다. 그냥 바이트 버킷 이후

msg.messageKind = PositionMessage; 

는 일반적으로, 당신은 당신이있는 NSData 객체에 캡슐화 원하는 무엇이든을 보낼 수 있습니다 : 예에서, 그것은이 라인의 목적이었을 것입니다. 이 예제에서와 같이 int 또는 struct와 같은 기본 유형 또는 NSObject (NSCoding을 구현하는 경우)를 보낼 수 있습니다. 이런 방법으로 NSObject를 보내고받는 것에 대한 더 자세한 정보는 NSKeyedArchiver, NSCoding, NSData를 읽어 보시기 바랍니다. 다음은 Apple의 참조 문서 Archving입니다.

받기에 관해서는, 당신은 방법을 부르지 않으며, 그것은 당신에 의해 키트에서 호출됩니다.그것은 "위임 메서드"(코코아 용어) 또는 "콜백 메서드"라고합니다. 앱이 비동기식으로 수신 할 수있는 "전화 통화"와 같이 생각할 수 있습니다. 서명이있는 메소드를 구현함으로써 :

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

... "나는 이런 종류의 전화를받을 수 있습니다."라고 말하고 있습니다. 그래서 GameKit이 당신을 대신하여 다른 플레이어로부터 데이터를 받으면 그 종류의 콜백을 받고 그 메소드를 호출 할 것이라는 것을 알게 될 것입니다. 그런 다음 수신 된 것을 기반으로 내부 어플리케이션 상태를 업데이트 할 것입니다. 이 메시지는 위에서 설명한 간단한 "정수 아무것도"전송되지 않았다면

은이 같은 메소드를 구현하는,이 예제를 계속하려면 다음을 가정, 물론,

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

updateScore : forPlayer :라는 메서드를 사용하면 점수 표를 업데이트 할 수 있습니다.

당신은 대의원 및 위임 방법이 블로그 항목에서 작동 방법에 대한 일반적인 논의/설명 찾을 수 있습니다 http://mohrt.blogspot.com/2010/01/cocoa-and-delegates.html

ADDED : 아스 커 게시 된 코드를 사용하여, 나는 몇 가지 수정을 만든 버전을 생산하는 이 베어 본 유스 케이스의 "작동". Working Version of Test App To Send One Integer Through GameCenter 나는 코드의 품질이나 그 무엇에 대한 적합성에 대해서는 아무런 주장도하지 않고있다. 나는 그것의 99.9 %를 쓰지 않았다 - 거기에 나타나는 어떤 것도 옹호하기 위해 여기에 내 게시를하지 말아라.

하나의 교훈을 배웠습니다. (모르기 때문에 다른 사람들에게 도움이되기를 바라고 있습니다.) 시뮬레이터에서 중매 서비스를 사용할 수 없다는 것입니다. 즉,이 시나리오를 테스트하기 위해 두 가지 개발 공급 iOS 장치가 필요하며, 두 가지 개발 컴퓨터가 동시에 두 장치를 디버깅하는 것이 중요합니다. 이 문제는이 문제를 파악하는 데 가장 많은 시간을 들게합니다.

+0

대단히 감사합니다. 'match'는 단지 새로운 GKMatch 일 뿐이지 만 선언 할 수도 있고 특정 장소에서 있어야 할 수도 있습니다. –

+0

이 방법의 경우 일치 항목이 전달됩니다. 나는 당신이 그것에 대해 걱정할 필요가 없다는 단순한 경우 (즉, 한 번에 오직 하나의 게임 만)에이 방법들에서 그것으로 아무 것도하지 않는다고 생각합니다. 일반적으로 성냥에 대한 자세한 정보를 찾고 계시다면, 그들은 중매 서비스에서 왔습니다. 여기 세부 정보 : http://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/GameKit_Guide/MatchesandVoice/MatchesandVoice.html#//apple_ref/doc/uid/TP40008304-CH10-SW9 – ipmcc

+0

수신 데이터 메소드는 GKMatch'match'를 제공하지만 sendScore 메소드에서'match '는 어디에서 왔습니까? –