我目前正在使用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,我设法知道两个用户都有一个空的匹配列表(与显示的状态一致)。
我还创建了第三个Sandbox帐户。 命名两个第一个帐户A和B,C为第三个帐户。
州1:
- A和B未与任何比赛相关联。
- A和B都得到了#34;无法创造游戏"创建任何游戏时出错(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,这是否与内存问题有关?我不是一个真正的内存管理大师,但似乎对我的理解是正确的。
知道这可能与我的代码有关而不是游戏中心吗? 非常感谢您提供的任何可以帮助我走得更远的答案。
这是我的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];
}
当我发布自动匹配时,它会发出完全相同的错误"无法创建游戏 - 请删除现有游戏并重试。"。
答案 0 :(得分:1)
只是为了确保:在这两个设备中,在身份验证完成处理程序中添加这些行并运行一次。 (然后你可以评论出来)。
[GKTurnBasedMatch loadMatchesWithCompletionHandler:(^)(NSArray *matches, NSError *error) {
for (GKTurnbasedMatch *match in matches) {
[match removeWithCompletionHandler:NULL];
}
}];
这将确保从您的播放器ID中删除所有游戏。
答案 1 :(得分:1)
这可能是也可能不是您问题的解决方案,但我遇到了类似的问题,并通过以下方式解决了这个问题。
似乎默认情况下,或者不知何故,Game Center将具有不同CFBundleVersion
(内部版本号,不是版本号或CFBundleShortVersionString
)值的应用视为彼此不兼容,因此不会使用递增的内部版本号显示应用之间的匹配。 (通常,开发人员会在开发期间分发新的临时版本或稳定版本时增加此编号,因此这非常不幸。)
要查找并删除“缺失”游戏,我会减少CFBundleVersion
值(显示游戏),然后删除违规游戏。
或者,调整iTunes Connect中的某些设置似乎已删除此CFBundleVersion
不兼容性。传播需要一段时间,但我认为点击我的应用程序是什么,点击查看详细信息,确保Game Center开关设置为“已启用”,并确保“多人游戏兼容性”中有一个项目表。您还可以在原始应用程序屏幕的“管理游戏中心”按钮中玩这些可能性,但我认为“多人兼容性”设置最终允许我查看之前隐藏的所有“旧”匹配。
答案 2 :(得分:0)
太荒谬了。您不必删除现有匹配项来创建新匹配项。我正在开发这样的游戏,它确实有效。
答案 3 :(得分: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");
}
}];
}
}];
}