我目前正在使用 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:
- A 和 B 未链接到任何匹配项。
- A 和 B 在创建任何游戏时都出现“无法创建游戏”错误(A 邀请 B,A||B 邀请其他玩家,A||B 创建新的自动匹配)。
状态 2:
- C(工作账号)可以邀请B,正常和B组队。
- C(工作)可以邀请B同时参加另一个聚会
- C(工作)邀请 A 玩。
- 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];
}
当我启动自动匹配时,它会启动完全相同的错误“无法创建游戏 - 请删除现有游戏并重试。”。