GameKit( iphone SDK3.1 フレームワーク)

近況です。 - Mr_MONKの日記
で前にテストしていたのだが
送らばせながら アプリに実装することにしました。
OS4だとGameCenterからネット対戦も可能になるようですが
今回はSDK3.1ベースの 近距離対戦しか対応させませんでした。

  • GKPeerPickerControllerを使わない

実機が1台しか手元にないのですが、ブルーツゥースはシュミレータ
iphoneではつながらないようです。GKPeerPickerControllerはWIFI
での接続はしてくれないようなんで 通信対戦のデバッグができません。ということで前にも実験したようにGKPeerPickerControllerは
使わないで GKSessionだけで実装することにしました。

  1. TableViewに リストアップさせる

GKPeerPickerControllerを使わないので対戦相手リストをTableViewに
表示して 接続相手を選ぶインターフェース部分を自前で実装させる
必要がありました。

やり方自体は単純で

GKSession *aSession = GKSession alloc] initWithSessionID:nil

displayName:user.displayName

sessionMode:GKSessionModePeer];

self.gkSession = aSession;

self.gkSession.delegate = self;

self.gkSession.available = YES;

のようにGKSessionのインスタンスを作成して
あとは

  • (void)session:(GKSession *)aSession peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state

の中で
if(state == GKPeerStateAvailable) {
//TAbleViewにセルを追加
}
if(state == GKPeerStateUnavailable)
//TAbleViewにセルを削除
}

のようにするだけです。
peeIDだと数字の羅列で誰の端末かわからないので
[asession displayNameForPeer:peerID];
のようにGkSessionのdisplayNameForPeerメソッドで
変換します。シュミレーターだとIphoneShmirator
実機だとituneで設定した名前が入りました。

あとはTableViewのリストを選択した際に

  • (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

[asession connectToPeer:[foundServers objectAtIndex:indexPath.row] withTimeout:2];
}

のようにリクエストを出して 
受け側では下記のようにacceptConnectionFromPeerすることで
接続が確立します。

  • (void)session:(GKSession *)session didReceiveConnectionRequestFromPeer:(NSString *)peerID {

[asession acceptConnectionFromPeer:peerID error:&error]
}

理屈ではこれであとはデータ送受信するだけなんですが

実際にはいろいろ問題がありました。
次の機会にこのつづきは書きたいと思います。