5

ターンベースのゲームに「クイックマッチ」モードが必要です。このモードでは、プレーヤーが最初に利用可能になったプレーヤーと自動的に一致します。独自のカスタム UI を使用しています。これまでの私のコードは次のようになります。

- (void)quickMatch {
  GKMatchRequest *request = [[GKMatchRequest alloc] init];
  request.minPlayers = 2;
  request.maxPlayers = 2;
  request.playersToInvite = nil;
  [GKTurnBasedMatch findMatchForRequest:request withCompletionHandler:^(GKTurnBasedMatch *match, NSError *error) {
    NSLog(@"MATCH: %@ %@ %@ %d",error,match,match.matchID,(int)match.status);
  }];

これにより、一致が正常に作成されますが、一致の 2 番目の参加者にはnullID ( playerID:(null) status:Matching) があります。

別の Game Center ID を使用して、この同じコードを別のインスタンスで実行すると、2 人のユーザーが互いに照合されると思いましたが、それは正しくないようです。関数を呼び出すたびにGKTurnBasedMatch loadMatchesWithCompletionHandler、有効な参加者 (ローカル プレイヤー) が 1 人だけの同じ試合を取得し続けます。

この質問はiOS Development: How do I auto matchplayer in Game Center?に似ているようです。これは、設定request.playersToInvite = nil;が自動マッチングを達成する必要があることを示していますが、これは私にとってはうまくいかないようです。

Game Center でこれらのプレイヤーを自動的にマッチングさせるにはどうすればよいですか?

4

1 に答える 1

8

ここであなたが見ている問題に対処させてください。まず、playersToInvite プロパティを nil に設定する必要はありません。これは、プレイヤーが割り当てられていない限りデフォルトの状態ですが、「問題」の原因にはなりません。実際にコードを正しく実行し、そこにない問題しか認識していないため、引用符で囲みました。findMatchForeRequest が完了するとどうなるかを説明します。

完了ブロックが呼び出されると、Game Center は 2 人の参加者を持つ新しい GKTurnBasedMatch オブジェクトを作成しました。1 人目はローカル プレイヤー (あなた) で、2 人目は実際にはプレイヤー ID が nil の空の参加者です。これは、ランダムな (割り当てられていない) 対戦相手との対戦が作成されたときに、Game Center がすべての参加者を割り当てないためです。順番が送信されると、ランダムな参加者が割り当てられます。あなたのゲームでは、あなたが最初のターンを取るまで、その対戦は他の人が参加できるようにクラウドに表示されません。

これで、他のデバイス/Game Center ID で loadMatchesWithCompletionHandler を呼び出しても、playersToInvite でそのプレーヤーを特に招待しない限り (そして、上記で指定された順番に既に参加していない限り)、自動的に一致が表示されることはありません。次のように考えてみてください。このように機能した場合、世界中のすべてのプレイヤーが loadMatchesWithCompletionHandler を呼び出したときに、存在するすべての自動対戦が表示されます。

他の Game Center ID は、実際には、他の ID が作成したゲームで利用可能な空席に一致させるために、playersToInvite プロパティを設定せずに findMatchForRequest を呼び出す必要があります。このようにして、マッチを作成するときの「常にあなたの番です」というパラダイムが維持されますが、そのプレイヤーは最初のスロットではなく 2 番目のスロットになります。最初の ID で行ったのとまったく同じ方法で 2 番目の ID でゲームを作成するだけで、ゲームは 2 人の参加者で作成されます。 findMatchForRequest を呼び出します。ここで重要なのは、playersToInvite が nil の場合、findMatchForRequest は常に新しいマッチを作成するとは限らないということです。オープン シートの既存のマッチがある場合、ローカル プレイヤーをそれにマッチさせるだけです。

ハッピーコーディング!
コービン

于 2013-11-04T00:57:40.670 に答える