我目前正在开发一款回合制游戏,使用Game Center来处理在线功能(匹配和回合处理)。
我使用了两个沙盒账户——一个在我的3gs上,另一个在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);
}
}];
}
}
(注意:该游戏只有两名玩家)
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];
}
当我启动自动匹配时,它会显示相同的错误信息:“无法创建游戏 - 请删除现有游戏并重试。”。