-
Notifications
You must be signed in to change notification settings - Fork 0
Internet Match & Nearby Match
yokoe edited this page Sep 14, 2010
·
19 revisions
- インターネット経由、あるいは無線LAN/Bluetoothを使った近隣のユーザ同士で対戦するための機能を提供します。
- PANKIAを使ったインターネット対戦/ローカル対戦は下記のような流れで行われます。
- ダッシュボードを開く
- インターネット対戦あるいはローカル対戦用のルームをユーザが作る
- 他のユーザがその部屋に入室する
- メンバーが揃う
- ゲームが開始される
- 対戦する
- ゲーム終了
- ダッシュボードに戻る
- ゲーム側では対戦がインターネット対戦/ローカル対戦なのかを意識する必要はありません。
- 部屋の作成はダッシュボード上で行います。
- 部屋が作成されメンバーが揃いゲームが開始されるまで、ゲーム側で行う処理はありません。
- (void)startInternetMatch { //インターネットマッチの画面を開いた状態でダッシュボードを開きます。 [PankiaNet launchDashboardWithInternetMatchView]; }
- 部屋に人数が揃い対戦の準備ができるとgameSessionWillBegin:が呼ばれます。
- (void)gameSessionWillBegin:(PNGameSession*)gameSession { //このメソッドがよばれたら、対戦のためにゲームを初期化します。 }
- 対戦が開始される時にgameSessoinDidBegin:が呼ばれます。
- ここで引数で渡されるgameSessionは対戦中相手にパケットを送信したり、経過時間を取得するために使用するため、ゲーム側で保持しておきます。
- (void)gameSessionDidBegin:(PNGameSession*)gameSession { currentGameSession = [gameSession retain]; }
- -[PNGameSession timeFromGameBeginning]でゲーム開始からの経過秒数を取得することができます。
- ロード等の処理に時間がかかることが考えられるため、最初の10秒程度は待機時間として使用することをお勧めします。
- (void)updateGame { if (!currentGameSession) return; float elapsedTime = [currentGameSession timeFromGameBeginning]; NSLog(@"%f 秒経過", elapsedTime); [self performSelector:@selector(updateGame) withObject:nil afterDelay:1.0f]; // 1秒後にゲームを再び更新します。 }
- 対戦相手にデータを送信するには、-[PNGameSession sendData:toPeers:withDataMode:]を使用します。
- (void)sendPacketToOpponents { [currentGameSession sendData:@"test" toPeers:[currentGameSession peerList] withDataMode:kPNGameSessionUnreliable]; }
- データを受け取ったユーザ側ではgameSession:didReceiveData:from:が呼ばれます。
-(void)gameSession:(PNGameSession*)gameSession didReceiveData:(NSData*)data from:(PNPeer*)opponent { NSLog(@"%d",data); }
- 誰か一人のユーザが-[PNGameSession finish:rematchTimeout:]を呼び出すと対戦終了の準備が行われます。
- -[PNGameSession finish:rematchTimeout:]を呼ぶ時には、ゲームの勝敗情報を引数にセットします。
- そうすることで、サーバー上でグレードポイントの変動等が行われます。
- -[PNGameSession finish:rematchTimeout:]が呼ばれただけでは、対戦は終了しません。
- (void)finishMatch{ PNGameSet* gameSet = [[[PNGameSet alloc] init] autorelease]; for(PNPeer* peer in [gameSession peerList]) { [gameSet setGradePoint:peer.user.username point:50-rand()%100]; } [currentGameSession finish:gameSet rematchTimeout:10.0f]; }
- スコアを送信しおえたら、最後に-[PNGameSession endGameSession]を呼びます。
- (void)endMatch{ [currentGameSession endGameSession]; }
- ゲームが終了されるタイミングではgameSessionDidEnd:が呼ばれます。
- ゲームセッションはこの後は使用しないため破棄します。
- (void)gameSessionDidEnd:(PNGameSession*)gameSession { [currentGameSession release]; currentGameSession = nil; }