-
Notifications
You must be signed in to change notification settings - Fork 0
Internet Match & Nearby Match
yokoe edited this page Oct 18, 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:]を呼び出すと対戦終了の準備が行われます。
- -[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]; }