gpt4 book ai didi

objective-c - 离线游戏中心 iOS 成就

转载 作者:技术小花猫 更新时间:2023-10-29 11:24:44 25 4
gpt4 key购买 nike

尝试找出在离线模式(例如飞行模式打开)的情况下使用 Game Center 中的成就的最佳方式。

据我了解,iOS 5+ 中的 Game Center 负责处理离线提交的成就和分数。它就像一个代理缓存,并在用户下次在线时将它们提交到在线游戏中心。考虑到这就是我所做的:

用户身份验证成功时,我加载成就并将它们存储在字典中。

[GKAchievement loadAchievementsWithCompletionHandler:^(NSArray *gcAchievments, NSError *error)
{
if (error) { ..skipped ..}
//This dictionary will store current achievments, so that we didn't submit them
//once more and didn't show notification.
achievments = [[NSMutableDictionary alloc] initWithCapacity:gcAchievments.count];

//Storing achievments in dictionary
for(GKAchievement *a in gcAchievments)
[achievments setObject:a forKey:a.identifier];
}];

稍后当我提交新成就时,我会在字典中检查成就,如果成就已经完成则不提交。如果我提交成就,我也会将其添加到 achievments 字典(内存中)以立即反射(reflect)该成就已提交。

GKAchievement *cachedAchievment = [achievments objectForKey:identifier];
if (cachedAchievment && cachedAchievment.percentComplete >= 100)
{
//Already unlocked this achievment.
return;
}

GKAchievement *achievement = [[GKAchievement alloc] initWithIdentifier: identifier];
if (achievement)
{
achievement.percentComplete = percent;
[achievement reportAchievementWithCompletionHandler:^(NSError *error)
{
if (!error)
{
//Flagging achievment as completed locally to avoid achieving it second time and showing notification.
[achievments setObject:achievement forKey:achievement.identifier];

//Now shoing notification banner.
GKAchievementDescription * desc = [achievmentsDescriptions objectForKey:achievement.identifier];
[[GKAchievementHandler defaultHandler] notifyAchievement:desc];
}
else
{
NSLog(@"Error in reporting achievements: %@", error);
}
}];
}

这种方法允许我在游戏代码中触发提交,而不必担心我会提交两次成就或显示两次通知横幅。

当 Game Center 在线时一切正常。但如果我离线,我会遇到 2 个问题。

  1. 加载代码返回错误,并且 achievments 的初始字典未填充已完成的成就,这意味着每次用户启动游戏时,他/她都会再次收到每个成就的通知横幅,甚至如果它已经被授予。然后将其放入字典后不显示,但我不想在每次游戏开始时显示一次成就。

  2. 我不确定离线提交的成就是否会在用户在线时到达 Game Center。我可以使用持久存储(如数据库)来解决问题 #1,以存储游戏启动之间的成就状态,但是我应该在 Game Center 在线时重新提交它们吗?我如何检测 Game Center 是否真的在线,因为即使是离线 reportAchievementWithCompletionHandler 没有错误地完成,所以我无法检测它是否未提交。这是我的测试方式,我打开飞行模式,解锁一些成就,然后关闭飞行模式,成就不会进入游戏中心,尽管这可能是“沙盒”问题。

最佳答案

为您提到的“成就解锁”添加持久存储,并为每个成就存储一个“成功提交到游戏中心”标志。然后,在线时,在启动时检查 loadAchievementsWithCompletionHandler 的结果,并定期查看每个解锁 && !submitted 的成就是否确实到达了 Game Center,如果没有则重新提交。

关于objective-c - 离线游戏中心 iOS 成就,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14223114/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com