私は現在、Game Center を使用してオンライン機能 (マッチメイキングとターン処理) を処理するターン ベースのゲームを開発しています。
私は 2 つのサンドボックス アカウントを使用しています。1 つは 3gs で、もう 1 つは iOS シミュレーターです。GKTurnBasedMatchMakerViewController を使用してアプリをテストし、しばらく問題なくマッチ メイキングを行っていましたが、現在問題が発生しています。
別のプレーヤーを新しいプレーヤーに招待するたびに (どちらか一方のプレーヤーで)、GKTurnBasedMatchMakerViewController は次のような UIAlertView を表示します。
ゲームを作成できませんでした - 既存のゲームを削除して、もう一度お試しください。
問題は、各プレイヤーのすべての試合を削除したことです (リストにゲームを持っているプレイヤーはいません (クローズド ゲームでさえありません)。そのため、現時点でどのユーザーも試合に参加していません。
私の GKTurnBaseMatchMakerViewControllerDelegate では、turnBasedMatchmakerViewController:didFailWithError:は呼び出されません。UIAlertView の [OK] ボタンをクリックしたときにデリゲートで呼び出される唯一の関数は、turnBasedMatchmakerViewControllerWasCancelled です。
私が考えることができる唯一のことは、私のゲームが実際には GameCenter から削除されていないということですが、GKMatchMakerViewController UI を使用してゲームを削除しているので、ほとんどそうは思いません。
ターンベースの試合を終了するとき、次のようにturnBasedMatchmakerViewController:playerQuitForMatch:を実装しました。
- (void)turnBasedMatchmakerViewController:(GKTurnBasedMatchmakerViewController *)viewController playerQuitForMatch:(GKTurnBasedMatch *)match
{
if ( [self isLocalPlayerCurrentPlayerForMatch:match] ) {
NSData* endData = match.matchData;
for (GKTurnBasedParticipant* participant in match.participants) {
participant.matchOutcome = GKTurnBasedMatchOutcomeWon;
}
match.currentParticipant.matchOutcome = GKTurnBasedMatchOutcomeLost;
[match endMatchInTurnWithMatchData:endData
completionHandler:^(NSError *error) {
if (error) {
NSLog(@"%@",error.description);
}
}];
}
}
(注:ゲームには2人のプレーヤーしかいません)
isLocalPlayerCurrentPlayerForMatch は次のとおりです。
- (BOOL) isLocalPlayerCurrentPlayerForMatch:(GKTurnBasedMatch*)match
{
return [[[GKLocalPlayer localPlayer] playerID] isEqualToString:match.currentParticipant.playerID];
}
誰かがこの問題に遭遇して解決策を見つけましたか? ここで何か間違ったことをしているのですか、それともあまりにも明白すぎて見えないだけですか?
その問題の根本を見つけるのに役立つコメントをありがとうございます。
アップデート
@kaan-dedeoglu のおかげで、両方のユーザーの一致リストが空であることがわかりました (表示された状態と一致しています)。
3 つ目のサンドボックス アカウントも作成しました。最初の 2 つのアカウントを A と B、C を 3 つ目のアカウントとします。
状態 1:
- A と B はどのマッチにもリンクされていません。
- ゲームの作成中に、A と B の両方に「ゲームを作成できませんでした」というエラーが表示されます (A は B を招待し、A||B は他のプレイヤーを招待し、A||B は新しいオートマッチを作成します)。
状態 2:
- C (作業アカウント) は B を招待でき、通常は B とパーティーを行います。
- C (作業中) は B を別の同時パーティに招待できます
- C (仕事中) は A を遊びに招待します。
- プレイできません (現在のマッチのリストにアクセスできません。GKTurnBasedMatchMakerViewController は直接新しいゲームの作成に進みます)。
- Cはもう機能していません。
- A、B、C が「ゲームを作成できませんでした」というエラーでスタックするようになりました。
ここで補足として、GKTurnBasedMatchMakerViewController を初期化する方法を示しますが、それが間違っているとは思いません。
- (void) displayMatchMakerVC
{
if (! [[GKLocalPlayer localPlayer] isAuthenticated] ) return;
GKMatchRequest* request = [[[GKMatchRequest alloc] init] autorelease];
int nbPlayers = 2;
request.minPlayers = nbPlayers;
request.maxPlayers = nbPlayers;
GKTurnBasedMatchmakerViewController* matchMakerVC = [[[GKTurnBasedMatchmakerViewController alloc] initWithMatchRequest:request] autorelease];
matchMakerVC.turnBasedMatchmakerDelegate = self;
matchMakerVC.showExistingMatches = YES;
[[CCDirector sharedDirector] presentModalViewController:matchMakerVC animated:YES];
}
注意: 私は ARC を使用していません。これはメモリの問題に関連している可能性がありますか? 私は実際にはメモリ管理の達人ではありませんが、私の理解では正しいようです。
これがゲームセンターではなく私のコードにどのように関連している可能性があるかについてのアイデアはありますか? 私がさらに進むのに役立つ回答をありがとうございました。
更新 2: turnbasedMatchmakerViewController:didFindMatchMethod:
これが私の turnbasedMatchmakerViewController:didFindMatchMethod: メソッドです。
- (void)turnBasedMatchmakerViewController:(GKTurnBasedMatchmakerViewController *)viewController didFindMatch:(GKTurnBasedMatch *)match
{
BLTheme* theme = [[[BLGameConfig sharedConfig] localPlayer] userTheme];
GameSceneRemoteGCLoader* loader = [[GameSceneRemoteGCLoader alloc] initWithGKMatch:match andTheme:theme];
[viewController dismissViewControllerAnimated:NO completion:^{}];
[[CCDirector sharedDirector] replaceScene:loader];
}
オートマッチを起動すると、まったく同じエラー「ゲームを作成できませんでした - 既存のゲームを削除してからやり直してください。」が表示されます。