このシリーズもはや5回目。 今回が最終回となります。
ご無沙汰してますコンドウです。 一応前回のリンクも貼っておきます。
今回は前回の予告通りやっと通信処理です 送信及び受信はIPアドレスではなく、プレイヤー識別子と呼ばれる文字列で相手を指定します。
// パケット送信 -(int)send:(NSData *)data playerID:(NSString *)player { if(self.MyMatch){ // オンラインなら NSError *error=nil; [self.MyMatch sendData:data toPlayers:[NSArray arrayWithObject:player] withDataMode:GKMatchSendDataUnreliable error:&error]; return (error!=nil); } return -1; // マッチングしてない }
送信したい相手のPlayerIDと送信したいデータを渡して実行すれば送信してくれます。 PlayerIDはマッチングした時に得られますのでそれを指定します。 使用例は以下の通り。
// データを送信してみる -(int)foo:(const void*)data length:(int)len { int ret=0; GameCenter *gc = [GameCenter sharedManager]; NSMutableData *packet=[[NSMutableData alloc] initWithLength:len]; memcpy(packet, data, len); ret = (int)[gc send:packet playerID:_playersInfo._person[0]._playerID]; [packet release]; return ret; }
マッチングの一番上([0])に対してデータを送信する場合、↑のように記述すればいけます。 因みにマッチングメンバー全員に同時に送る場合はsend関数で実行しているsendData関数の 代わりにsendDataToAllPlayers関数を指定すればokです。 続いて受信です。受信は能動的な受信関数がある訳ではなく、前回のマッチング用デリゲート関数と同じように メソッドを用意すればokです。
// (internal) データ受信 - (void)match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID { // データ受信するとこの関数がシステムから呼ばれる // 引数dataに受信データ、playerIDに送信者のPlayerIDが格納されて呼び出される // 必要に応じてデータをプールするなどの処理をここで書きます。 }
受信は↑の関数を用意しておけばあとは受信する度にシステムより呼び出されます。 これで通信が行えるようになりましたね あと、マッチングを終了(もしくはマッチングから抜ける)する場合は、切断関数を用意しました。
- (void)disconnect { if(self.MyMatch){ [self.MyMatch disconnect]; } }
他にもGKMatchクラスにはデリゲートやプロパティなどありますので是非ドキュメントを読み漁って下さい。
最新のSDK情報はWeb上にあります。例えばGKMatchクラスについて調べたいならgoogle等で”GKMatch“と直接 検索するとアップル社のリファレンス(英語)が一番先頭に出てくると思います。
英語になるので英語苦手な人は尻込みするかもしれませんが、なるべく頑張って読んでみて下さい。
そんなに 難しい英語ではありませんくじけそうならChromeの日本語翻訳機能に頼るのも手です
ドキュメントの中で打ち消し線を引いているメソッドやプロパティは「将来削除予定」を示しています。 今それを使用したコードを書いている場合は、使わないようにする対応が必要になります。
この消えていく関数/追加される関数はアップルのSDKではよくあります。(WindowsのAPI以上に多いです)
突然使えなくなる訳ではありませんが、近い将来に改変させる事を留意しプログラミングを進めていかなくては ならない点は本当に注意が必要です
アップルのGame Centerについて全5回のシリーズで進めましたが実はまだまだ書けるネタは沢山あります。 例えばターン制マッチングや、実績など。
Game Centerの最大の魅力は以前にも言いましたが専用のサーバーを用意する事無くネットワーク通信ゲームが 作成できるところです。(但しGame Centerに無い機能を利用したい場合はサーバー用意する必要が出てきますが..)
手軽に通信対戦のアプリを作成できる魅力は本当に大きいですから是非Game Centerを利用して楽しい通信ゲーム作成に 挑戦していただければうれしいです