【问题标题】:How to save game progress in a SpriteKit game如何在 SpriteKit 游戏中保存游戏进度
【发布时间】:2017-09-20 17:15:21
【问题描述】:

我目前正在使用 SpriteKit、GameplayKit 和 JSTileMap 开发一款游戏。我正在尝试实现一个功能来保存游戏进度。我尝试使用 NSCoder 对每个类中的所有变量进行编码/解码,但 XCode 告诉我所有使用 Entity 和 Component 的类都不符合 NSCoding。那么如何保存我的游戏数据呢?我可以只对主要游戏场景中的所有内容进行编码,它就可以工作吗?

感谢您的帮助。

【问题讨论】:

  • 实体类和组件类是你做的吗?
  • 不,它们是 GKEntity 和 GKComponent 的子类
  • 好的,是的,是你制作的。只需将 NSCoding 协议附加到这些类并正确处理协议所需的解码和编码
  • 这正是问题所在。这些类都不允许我附加 NSCoding 协议。我收到一条错误消息,指出它们不符合 NSCoding。

标签: swift sprite-kit


【解决方案1】:

确保你正确地遵守了 NSCoding 协议,应该是这样的

class Entity : GKEntity,NSCoding
{
    func encodeWithCoder(aCoder: NSCoder)
    {

    }
    required init?(coder aDecoder: NSCoder)
    {

    }
}

class Component : GKComponent,NSCoding
{
    func encodeWithCoder(aCoder: NSCoder)
    {

    }
    required init?(coder aDecoder: NSCoder)
    {

    }
}

【讨论】:

  • 我想我应该问一下是swift还是objective-c,objective-c看起来有点不同
  • 它是用swift编写的。谢谢你的例子。这就是我所做的,但在第一行收到一条错误消息:class Entity: GKEntity, NSCoding { }。它不允许我把 NSCoding 放在那里。
  • 什么错误?我在操场上有这个,我没有收到错误
  • 抱歉,我目前无法访问我的 Xcode 项目。让我在回家的时候再检查一遍,然后告诉你。感谢您的快速回复。
  • 我会仔细检查您使用的是 NSCoding,而不是 NSCoder
【解决方案2】:

如何创建一个名为 GameData 的 Singleton 类,其中包含您需要保存的所有属性,例如分数、高分等。

类似于我在此处发布的示例 SpriteKit: Why does it wait one round for the score to update? (Swift)

正如其他人所说,您的问题非常广泛。

【讨论】:

  • 感谢您的链接,但我正在尝试保存游戏的实际进度,包括所有实体在地图上的当前位置以及他们的 HP/Mana/EXP 等。单例类是否可以能够处理所有这些吗?
  • Himhh 可能,对每个级别只使用 NSCODING 可能会更好。这取决于您的游戏的结构
【解决方案3】:

就其价值而言,StackOverflows 擅长帮助开发人员在非常具体的代码中解决非常具体的问题。像这样的问题更多的是寻求主观建议,并且会被成千上万自封的 SO 问题沙皇所反对。也就是说,这是我的看法:

我现在正在创建一个依赖于许多对象和深度嵌套字典的应用程序中遇到一个非常类似的问题。我开始尝试对对象本身进行 NSEncode 并在启动期间解包和加载这些对象。我很快发现这是有问题的,容易出错,而且过于复杂。我现在尝试的方法略有不同。我正在做的是在游戏期间偶尔通过将它们转换为 NSData 集并将它们存储在 NSUserDefault 中来保存这些关键字典。游戏启动时,我解压缩所有这些字典并用它们构建对象。我发现这种方法(到目前为止)更容易,并且只保存构建对象的数据也可以节省空间。

【讨论】:

  • 感谢您分享您的想法。我也会调查一下。
猜你喜欢
  • 1970-01-01
  • 2020-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
相关资源
最近更新 更多