4

我目前正在使用 Game Center 开发一个基于回合的游戏来处理在线功能(用于匹配和回合处理)。

我正在使用两个沙盒帐户——一个在我的 3gs 上,一个在 ios Simulator 上。我一直在使用 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);
                       }
                     }];
  }  

}

(注意:我在游戏中只有两个玩家)

其中 isLocalPlayerCurrentPlayerForMatch 是:

- (BOOL) isLocalPlayerCurrentPlayerForMatch:(GKTurnBasedMatch*)match
{
  return [[[GKLocalPlayer localPlayer] playerID] isEqualToString:match.currentParticipant.playerID];
}

有没有人遇到并找到解决此问题的方法?我在这里做错了什么,还是很明显我看不到?

非常感谢您提供任何有助于我找到该问题根源的评论。

更新

感谢@kaan-dedeoglu,我设法知道两个用户都有一个空的匹配列​​表(与显示的状态一致)。

我还创建了第三个沙盒帐户。将前两个帐户命名为 A 和 B,将 C 命名为第三个帐户。

状态 1:

  1. A 和 B 未链接到任何匹配项。
  2. A 和 B 在创建任何游戏时都出现“无法创建游戏”错误(A 邀请 B,A||B 邀请其他玩家,A||B 创建新的自动匹配)。

状态 2:

  1. C(工作账号)可以邀请B,正常和B组队。
  2. C(工作)可以邀请B同时参加另一个聚会
  3. C(工作)邀请 A 玩。
  4. A 不能玩(不能访问当前比赛列表,GKTurnBasedMatchMakerViewController 直接去创建一个新游戏)。
  5. C 不工作了。
  6. 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];

}

当我启动自动匹配时,它会启动完全相同的错误“无法创建游戏 - 请删除现有游戏并重试。”。

4

4 回答 4

1

只是为了确保:在这两个设备中,将这些行添加到您的身份验证完成处理程序中并运行一次。(然后您可以将其注释掉)。

[GKTurnBasedMatch loadMatchesWithCompletionHandler:(^)(NSArray *matches, NSError *error) {

   for (GKTurnbasedMatch *match in matches) {

       [match removeWithCompletionHandler:NULL];

    }
}];

这将确保从您的 playerID 中删除所有游戏。

于 2012-06-04T12:28:00.003 回答
1

这可能是也可能不是您的问题的解决方案,但是我遇到了类似的问题并通过以下方式解决了它。

似乎默认情况下或不知何故,Game Center 将具有不同CFBundleVersion(内部版本号,不是版本号或CFBundleShortVersionString)值的应用程序视为彼此不兼容,因此不会显示具有递增内部版本号的应用程序之间的匹配。(通常,随着新的临时构建或稳定版本在开发过程中分发,开发人员会增加这个数字,所以这是非常不幸的)。

为了查找和删除“丢失”的游戏,我降低了我的CFBundleVersion价值(显示了游戏),然后删除了有问题的匹配项。

或者,调整 iTunes Connect 中的一些设置似乎已经消除了这种CFBundleVersion不兼容性。传播需要一段时间,但我认为它是在点击我的应用程序,点击查看详细信息,确保游戏中心开关设置为“启用”,并确保“多人游戏兼容性”中有一个项目桌子。您也可以在原始应用程序屏幕上的“管理游戏中心”按钮中玩各种可能性,但我认为“多人游戏兼容性”设置最终让我能够看到以前隐藏的所有“旧”比赛。

祝你好运!

于 2013-03-23T15:45:00.483 回答
0

太荒谬了。您不必删除现有匹配来创建新匹配。我正在开发这样的游戏,它确实有效。

于 2013-01-13T02:13:20.010 回答
0

以下对我有用。首先,我在设备上为每个玩家运行应用程序,调用 quitAllMatches。然后我在每台设备上再次运行该应用程序,调用 removeAllMatches。

从长远来看,最好在进行过程中清理它们。但这解决了眼前的问题。

-(void) quitAllMatches {
    [GKTurnBasedMatch loadMatchesWithCompletionHandler:^(NSArray* matches, NSError* error)  {
        for (GKTurnBasedMatch* match in matches) {
            GKTurnBasedParticipant* participant = match.currentParticipant;
            NSString* playerID = participant.playerID;
            NSString* localPlayerID = [GKLocalPlayer localPlayer].playerID;
            if ([playerID isEqualToString: localPlayerID]) {
                NSArray* participants = match.participants;
                for (GKTurnBasedParticipant* participant in participants) {
                    participant.matchOutcome = GKTurnBasedMatchOutcomeTied;
                }
                NSData* data = [NSData data];
                [match endMatchInTurnWithMatchData: data completionHandler:^(NSError* error) {
                    if (error) {
                        WJLog(@"did not end -- error %@", [error localizedDescription]);
                    }
                    else {
                        WJLog(@"match ended!");
                    }
                }];
            }
        }
    }];
}

-(void) removeAllMatches {
    [GKTurnBasedMatch loadMatchesWithCompletionHandler:^(NSArray* matches, NSError* error)  {
        for (GKTurnBasedMatch* match in matches) {
            [match removeWithCompletionHandler:^(NSError* error) {
                if (error) {
                    WJLog(@"error: %@", [error localizedDescription]);
                }
                else {
                    WJLog(@"removed match");
                }
            }];
        }
    }];
}
于 2013-05-19T03:18:22.367 回答