2011-01-01 21 views
6

EDIT: 私はきれいな新しいプロジェクトを作ったが、まだそれを稼働させることはできない。それをダウンロードしてください、そして、私が間違ってやっていることを見るために、プロや誰かがリモートで経験するために、おそらく簡単に見るための小さなコードがあります。その整数を送信しようとしています。Game Center - データの送受信

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

こんにちは

私は私のiphoneのゲームでゲームセンターのマルチプレイを実装しようと悩み、私はAppleのドキュメントで、データの送受信に関する第三者から手元に持っているサンプルをご理解を持っています。

誰かがここに公式のAppleのドキュメントのコードサンプルをしてください説明してくださいでした: 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]; 

または私は試合、データおよびplayerIDとして入力してください何

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

など。私は「スコア」という名前の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をご覧ください。

受信に関しては、メソッドを呼び出さず、キットによってあなたに呼び出されます。これは、「デリゲートメソッド」(Cocoaの用語集)または「コールバックメソッド」と呼ばれるものです。あなたは、あなたのアプリが非同期的に受け取ることができる "通話"のように考えることができます。シグネチャを持つメソッドを実装することにより:

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

を追加しました:アスカー投稿のコードを使用して、私はいくつかの変更を行い、そのバージョンを制作しましたこの素朴な骨のユースケースのために "働く"。 Working Version of Test App To Send One Integer Through GameCenter私は、コードの品質、またはその何かに対するまったくの適合性についていかなる請求もしません。私はそれの99.9%を書いていない - そこに表示されるものの何かを推薦するためにここに私の投稿を取ってはいけない。

レッスン1回(私が知りませんでしたので、他の人に役立つことを期待してここに入れています)は、シミュレータでマッチメイキングサービスを使用できないことです。これは、このシナリオをテストするために2つの開発用にプロビジョニングされたiOSデバイスが必要であり、2台の開発マシンが両方のデバイスを同時にデバッグすることが重要であることを意味します。この問題は、これを解明するのに最も時間がかかりました。

+0

これは大変ありがとうございます。 「合っている」というのはこれが新しいGKMatchなのか、それとも特定の場所から来る必要があるのでしょうか? –

+0

この方法の場合、マッチはあなたに渡されます。私は、あなたがそれについて心配する必要はない/これらの方法では何もしないという単純なケース(つまり、一度に1つのゲームだけが進行する)であると思われます。マッチメイキングの詳細情報をお探しの場合は、マッチメイキングサービスから来てください。詳細はこちら: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'を与えますが、' match'はsendScoreメソッドのどこから来ますか? –

関連する問題