【问题标题】:Robust Game Center Achievement code强大的游戏中心成就代码
【发布时间】:2012-03-31 16:32:18
【问题描述】:

在几乎每个向 Game Center 提交成就的示例中,我都看到了这段代码

[achievement reportAchievementWithCompletionHandler:^(NSError *error)
{
    if (error != nil)
    {
         // Retain the achievement object and try again later (not shown).
    }
}];

问题是,99% 的工作都是一条小小的评论。在过去的几个小时里,我一直在试图解决这个问题,这似乎是发送和重新发送以及保存和加载数据的无穷无尽的边缘案例。

有没有人知道一个很好的教程(或示例代码)实际上解释了困难的部分?

这并不像将它们保存到文件并稍后加载那么简单。当您开始不得不保留多个成就并稍后提交它们然后它们都返回失败(以块为单位!)并且您必须再次保存它们时......快速/安全......因为应用程序可能会退出并且你不想松开它们。

我正在拔头发。

【问题讨论】:

  • 我刚刚发现了另一个 SO 问题,它对回答我的问题大有帮助,但如果能提供更多详细信息,我们将不胜感激:link
  • 我也同意这是一个恼人的问题,因为块执行时间。我也没有找到好的解决方案。

标签: ios game-center


【解决方案1】:

我认为你不需要拔头发。

我认为基本模型是这样的:

(a) 独立于 Game Center,您的游戏有一个保存状态(无论如何您总是需要它,以将玩家恢复到您的游戏退出/后台时的位置)。此状态应包括恢复游戏状态所需的所有正常内容,此外还应包括游戏中所有成就的标志。

(b) Game Center 还存储您游戏中的所有成就。当您连接到 Game Center 时,您会下载已登录玩家的成就。 (关于登录玩家是谁会出现复杂情况,但你的问题不是这个,所以我们假设“一个真正的玩家”始终是登录 Game Center 的玩家。) p>

(c) 每当玩家取得成就时,首先更新游戏保存状态数据中的相应成就标志。其次,试着告诉 Game Center 那个成就。如果可行,请使用新数据更新您的 Game Centers 成就副本。

(d) 如果它不起作用,您有一个在您的持久状态中标记的成就,而在您的 Game Center 状态副本中没有标记。在各种方便的时间(例如,每当获得另一项成就时,当您结束关卡时,当您的应用程序启动时,当您的应用程序退出时等)检查您自己的状态与当前状态之间是否存在任何差异游戏中心状态。差异是您需要重新发送到 Game Center 的更新。尝试发送,但如果再次失败,请等到下一个机会(例如,每当获得另一个成就时,当您结束关卡时,当您的应用程序启动时,当您的应用程序退出时等)再试一次。您永远不会丢失数据,因为它在您本地的用户状态的真实画面中。 (您失去它的唯一方法是,如果用户在您成功将其下载到 Game Center 之前将其卸载,那么您能做什么?)

【讨论】:

    猜你喜欢
    • 2012-07-30
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多