GameKit( iphone SDK3.1 フレームワーク)
近況です。 - Mr_MONKの日記
で前にテストしていたのだが
送らばせながら アプリに実装することにしました。
OS4だとGameCenterからネット対戦も可能になるようですが
今回はSDK3.1ベースの 近距離対戦しか対応させませんでした。
- GKPeerPickerControllerを使わない
実機が1台しか手元にないのですが、ブルーツゥースはシュミレータ
とiphoneではつながらないようです。GKPeerPickerControllerはWIFI
での接続はしてくれないようなんで 通信対戦のデバッグができません。ということで前にも実験したようにGKPeerPickerControllerは
使わないで GKSessionだけで実装することにしました。
- 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]
}
理屈ではこれであとはデータ送受信するだけなんですが
実際にはいろいろ問題がありました。
次の機会にこのつづきは書きたいと思います。