Skip to content

Internet Match & Nearby Match

yokoe edited this page Sep 14, 2010 · 19 revisions

インターネット対戦/ローカル対戦

  • インターネット経由、あるいは無線LAN/Bluetoothを使った近隣のユーザ同士で対戦するための機能を提供します。

対戦の流れ

  • PANKIAを使ったインターネット対戦/ローカル対戦は下記のような流れで行われます。
  1. ダッシュボードを開く
  2. インターネット対戦あるいはローカル対戦用のルームをユーザが作る
  3. 他のユーザがその部屋に入室する
  4. メンバーが揃う
  5. ゲームが開始される
  6. 対戦する
  7. ゲーム終了
  8. ダッシュボードに戻る
  • ゲーム側では対戦がインターネット対戦/ローカル対戦なのかを意識する必要はありません。

部屋の作成

  • 部屋の作成はダッシュボード上で行います。
  • 部屋が作成されメンバーが揃いゲームが開始されるまで、ゲーム側で行う処理はありません。
- (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;
}
Clone this wiki locally