强大的游戏中心成就代码

时间:2011-08-28 06:26:53

标签: ios game-center

在几乎所有向游戏中心提交成就的例子中,我都会看到这段代码

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

问题是,一个小评论大约是99%的工作。我花了最后几个小时试图解决这个问题,这似乎是一组无休止的发送和重发以及保存和加载数据的边缘情况。

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

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

我把头发拉了出来。

1 个答案:

答案 0 :(得分:6)

我认为你不需要拔头发。

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

(a)独立于游戏中心,您的游戏有一个已保存的状态(无论如何,您总是需要将玩家恢复到游戏退出/后退时的状态)。此状态应包括恢复游戏状态所需的所有常规内容,此外还应包含游戏中所有成就的标记。

(b)游戏中心还存储游戏中的所有成就。当您连接到Game Center时,您可以下载已登录播放器的成就。 (对于谁登录的玩家来说是并发症,但你的问题与此无关,所以让我们假设"一个真正的玩家"总是签名 - 游戏中心玩家。)

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

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