Skip to content

Internet Match & Nearby Match

yokoe edited this page Oct 18, 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:]を呼び出すと対戦終了の準備が行われます。
  • -[PNGameSession finish:]を呼ぶ時には、ゲームの勝敗情報を引数にセットします。
  • インターネット対戦では、この数値をもとにグレードポイントの変動等が行われます。
  • -[PNGameSession finish:]が呼ばれただけでは、対戦は終了しません。
- (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];
}

終了させる場合

  • スコアを送信後、対戦を終了させたい場合は-[PNGameSession endGameSession]を呼びます。
- (void)endMatch{
    [currentGameSession endGameSession];
}
  • ゲームが終了されるタイミングではgameSessionDidEnd:が呼ばれます。
  • ゲームセッションはこの後は使用しないため破棄します。
- (void)gameSessionDidEnd:(PNGameSession*)gameSession
{
    [currentGameSession release];
    currentGameSession = nil;
}

リマッチさせる場合

  • リマッチはインターネットマッチ専用の機能です。
  • スコアを送信後、リマッチを可能にさせる場合は-[PNGameSession waitForRematch:]を呼んでください。
-(void)waitForRematch
{
	[gameSession waitForRematch:20];
}
  • waitForRematchが呼ばれると、プレイヤーはルーム画面に戻りほかのユーザを待ちます。
  • 引数で指定された秒数以内にほかのプレイヤーがルーム画面に戻ってこなかった場合は、リマッチは無効となります。
  • ローカルマッチではリマッチはありません。
  • そのため、インターネットマッチ/ローカルマッチ両方に対応させる場合には、gameSessionオブジェクトのgameSessionTypeプロパティをみて処理を分けてください。
-(void)matchFinished
{
	if (gameSession.gameSessionType == PNInternetSession) {
		[gameSession waitForRematch:20];
	} else {
		[gameSession endGameSession];
	}
}

部屋の人数の制限

  • 標準の状態では、ユーザが部屋を作るときに対戦人数を2人から4人の間で選択可能になっています。
  • [PankiaNet setInternetMatchMinRoomMember:]等のメソッドを呼ぶと、部屋を作るときの人数を制限することができます。
- (void)setRoomMaxMember
{
	[PankiaNet setInternetMatchMinRoomMember:3]; //インターネット対戦の部屋の下限を3人に
	[PankiaNet setInternetMatchMaxRoomMember:4]; //インターネット対戦の部屋の上限を4人に
	[PankiaNet setNearbyMatchMinRoomMember:3]; //ローカル対戦の部屋の下限を3人に
	[PankiaNet setNearbyMatchMaxRoomMember:4]; //ローカル対戦の部屋の上限を4人に
}

ロビー

  • PankiaNet.plist上で「LobbyEnabled」をYESにすると、ロビー機能を利用することができます。
  • PANKIAの管理サイト上であらかじめロビーを複数用意しておくことができます。(例:「ID:1 ステージ1」「ID:2 ステージ2」「ID:3 ランダム」など)
  • ロビー機能を使った場合、部屋はロビーごとにわかれて作成/表示されるようになります。
  • ロビーの情報はPNGameSessionから取得することができます。そこで必要に応じてゲームの内容(ステージやルールなど)を調整してください。
- (void)gameSessionDidBegin:(PNGameSession*)aGameSession
{
	NSLog(@"lobby: %d", aGameSession.room.lobby.id);
	[self displayParam:aGameSession];
}